UDP协议网络编程
UDP协议
UDP 是User Datagram Protocol的简称, 中文名是用户数据报协议,是OSI(Open System Interconnection,开放式系统互联) 参考模型中一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务。
UDP协议是面向非连接的协议,没有建立连接的过程, 因此通信效率很高。
它在通信实例两端各建立一个Socket, 这两个Socket之间没有虚拟链路, 这两个Socket知识发送,接收数据报的对象。
Java提供了 DatagramSocket对象作为UDP协议的Socket。
DatagramSocket
DatagramSocket本身只是码头,不维护状态, 不能产生IO流, 作用是接收和发送数据报, 使用 DatagramPacket代表数据报文。
DatagramSocket 的构造器:
DatagramSocket():创建一个实例, 绑定到本机默认IP, 本机可用端口中随机选择一个端口。
DatagramSocket(int port): 本机默认IP, 指定端口
DatagramSocket(int port, InetAddress addr): 绑定到指定ip,port。
receive(DatagramPacket p): 接收数据
send(DatagramPacket p): 发送数据
DatagramPacket 的构造器, 指定一个空数组, 长度,字节数, 还可以指定ip地址和端口
服务端接收到 DatagramPacket 时,可以通过下面方法获取ip和port
InetAddress getAddress() : 发送时,返回目标地址, 接收时, 返回发送主机ip
int getPort(): 返回 port
SocketAddress getSocketAddress(): 返回SocketAddress, 包括ip和port。
Server端:
public class UdpServerTest {
private int port = 9002;
//每个报文大小为4KB
private int dataLength = 4096;
//接收数据的数组
byte[] inBuff = new byte[dataLength];
//接收数据对象
private DatagramPacket inPacket = new DatagramPacket(inBuff, inBuff.length);
//发送数据对象
private DatagramPacket outPacket;
public void init() throws IOException{
try(
DatagramSocket socket = new DatagramSocket(port);
){
for (int i = 0; i < 100; i++){
//接收
socket.receive(inPacket);
// inPackage.getData 和 inBuff 是否是同一个数组
System.out.println(inBuff == inPacket.getData());
// 接收数据打印
System.out.println(new String(inBuff, 0, inPacket.getLength()));
byte[] sendData = "udp server".getBytes();
//发送数据
outPacket = new DatagramPacket(sendData, sendData.length, inPacket.getSocketAddress());
socket.send(outPacket);
}
}
}