基于UDP的Socket通信
与TCP对应的UDP协议,是传输层的另一个协议,它只在IP协议上增加了应用程序多道处理和简单的错误校验功能。
UDP从应用程序接过报文,附上源端口和目的端口以及length、checksum字段成为UDP段,就直接递交给网络层;网络层将UDP段封装在IP数据报中后,尽力而为的将数据报传递给目标主机。
若数据报到达接收主机,UDP将根据IP地址和两个端口,将段中数据交给相应进程。其间,两个收发进程的传输层实体不存在握手过程,因此UDP被认为是无连接的。UDP段封装在IP数据报中发送,与TCP不同,UDP不能将数据报分段传输。
DNS(域名服务)是使用UDP的一个应用层协议,当运行载主机中的DNS程序需要进行查询时,它将组成一个DNS查询报文,发送给UDP Socket。在不进行握手过程的情况下,UDP给报文加上段头后,直接交付给网络层。网络层将该段封装在IP数据报中后,将数据报发送给域名服务器。发出DNS的主机将等待域名服务器的应答,若等待不到应答,它有可能向其它域名服务器重发查询报文,或者报告无法获得域名信息的结果。
本次UDP数据报通信主要用到两个类DatagramPacket和DatagramSocket,前者负责将待传输的数据封装成数据报包对象,再由数据报套接字DatagramSocket类提供的send()和receive()方法进行发送和接收操作。
UDP数据报通信的主要过程如图所示:
- 发送时:创建待发送数据报包pack,其中指定目标主机的IP地址和接收端口,调用DatagramSocket的send(pack)方法发送pack数据报,发送端口需为可用端口。
- 接收时,创建指定端口的DatagramSocket,调用其receive(pack)方法接收数据报,接收的数据报存放在pack包的缓存区内,再调用pack.getData()方法获得pack中的数据。
对于上述过程可用简易代码实现:
UDP的发送过程:
public void UDP_Send(String msg)throws Exception {
byte[] buffer = msg.getBytes();//Change String to byte
InetAddress desip = InetAddress.getByName(Destip);//create destination IP address
DatagramPacket pack = new DatagramPacket(buffer, buffer.length, desip, Destport);//create send package
DatagramSocket Socket = new DatagramSocket();//create send Socket
try {
Socket.send(pack);//send massage
}
catch (Exception e) {
System.out.println("UDP 数据报发送失败!");
}
Socket.close();
}
UDP的接受过程:
public String UDP_Receive()throws Exception {
byte[] buffer = new byte[512];//create byte to receive massage
DatagramPacket pack = new DatagramPacket(buffer, buffer.length);//create pack to receive massage
DatagramSocket socket = new DatagramSocket(port);//set port for receive socket
socket.receive(pack);//write received massage to pack
socket.close();
return new String(pack.getData(),0,pack.getLength());//get received massage
}
上述过程将UDP通信的主要过程展现出来,但是无法显示可观的实时通信过程。小编基于UDP的Socket通信实现了点对点的实时通信系统,并对比了UDP与TCP在通信过程的异同。
获取源码链接:基于UDP的点对点通信系统
提取码:cnrc
综上所述,TCP是面向可靠交付连接的通信协议,比较适合做点对点通信,而UDP是面向无连接的通信协议,可能会存在掉帧的情况,它比较适合做电视、电话线路的传输,因为这些情形需要的是实时交互,不是可靠交互。
以上内容仅是小编个人观点,如有错漏,还请广大读者朋友们批评指正,谢谢大家。