UDP通讯

服务端Server.java:

package com.sknomy.udp;

import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;

/**
 * UDP通讯的服务端
 * @author sknomy
 *
 */
public class Server {
	public static void main(String[] args) {
		try {
			DatagramSocket socket = new DatagramSocket(8088);
			/*
			 * 接收客户端发送过来的数据
			 * 1.先准备一个接收数据用的空包
			 * 2.通过Socket接收数据
			 * 当接受完毕后,该接收包会有一些变化
			 * (1):包中就含有客户端发送过来的数据
			 * (2):包中还记录了客户端的地址信息
			 * (3):包也知道实际接收的读取长度
			 */
			//用于存放接收字节用的数组 
			byte[] data = new byte[100];
			/*
			 * 将自己数组设置到包中后,当接收到数据以后,就会存入到这个数组中
			 */
			DatagramPacket packet = new DatagramPacket(data, data.length);
			/*
			 * 接收数据
			 * 该方法是一个阻塞方法,直到一个客户端发送数据过来,这里才会将
			 * 数据存入并返回
			 */
			socket.receive(packet);
			/*
			 * 获取接收的数据
			 * 包提供了获取数据的方法:
			 * byte[] getDate()
			 * 该方法获取的数组就是上面的data数组
			 * 当我们不能直接访问该数据时,可以通过包获取。
			 */
			String message = new String(
					packet.getData(),
					0,
					packet.getLength(),		//获取实际接收的字节量
					"utf-8"
			);
			System.out.println("客户端说:"+message);
			
			
			
			
			
			/*
			 * 回复客户端
			 */
			//装备要发送的数据
			message = "你好客户端!";
			data = message.getBytes("utf-8");
			
			/*
			 * 准备地址信息(服务端的地址)
			 * 1.服务端地址
			 * 2.服务端端口
			 * 不同的通讯协议端口之间不冲突
			 * 我们可以在一台机器上同时开启一个TCP的8088端口和一个UDP协议的8088端口.   
			 */
			InetAddress address = packet.getAddress();
			int port = packet.getPort();
			
			//打包
			packet = new DatagramPacket(
				data,				//要发送的数据
				data.length,		//发送多少字节
				address,			//地址信息
				port				//端口信息
			);
			
			//发送
			socket.send(packet);
			
			//不再使用时应当关闭Socket释放资源
			socket.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}


客户端Client.java:

package com.sknomy.udp;

import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;

/**
 * UPD通讯的客户端
 * @author sknomy
 *
 */
public class Client {
	public static void main(String[] args) {
		try {
			//封装了UDP通讯的Socket
			DatagramSocket socket = new DatagramSocket();
			//装备要发送的数据
			String message = "你好服务端!";
			byte[] data = message.getBytes("utf-8");
			/*
			 * 准备地址信息(服务端的地址)
			 * 1.服务端地址
			 * 2.服务端端口
			 * 不同的通讯协议端口之间不冲突
			 * 我们可以在一台机器上同时开启一个TCP的8088端口和一个UDP协议的8088端口.   
			 */
			InetAddress address = InetAddress.getByName("localhost");
			int port = 8088;
			//打包
			DatagramPacket packet = new DatagramPacket(
				data,				//要发送的数据
				data.length,		//发送多少字节
				address,			//地址信息
				port				//端口信息
			);
			//发送
			socket.send(packet);
			
			
			
			
			/*
			 * 接收服务端发送过来的数据
			 */
			
			//用于存放接收字节用的数组 
			data = new byte[100];
			/*
			 * 将自己数组设置到包中后,当接收到数据以后,就会存入到这个数组中
			 */
			packet = new DatagramPacket(data, data.length);
			/*
			 * 接收数据
			 * 该方法是一个阻塞方法,直到一个客户端发送数据过来,这里才会将
			 * 数据存入并返回
			 */
			socket.receive(packet);
			/*
			 * 获取接收的数据
			 * 包提供了获取数据的方法:
			 * byte[] getDate()
			 * 该方法获取的数组就是上面的data数组
			 * 当我们不能直接访问该数据时,可以通过包获取。
			 */
			message = new String(
					packet.getData(),
					0,
					packet.getLength(),		//获取实际接收的字节量
					"utf-8"
			);
			System.out.println("服务端说:"+message);
			
			//不再使用时应当关闭Socket释放资源
			socket.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值