介绍
本篇文章为大家展示了如何在java中的使用UDP协议,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。
UDP是面向无连接的通讯协议,由于通讯不需要连接,所以可以实现广播发送.UDP通讯时不需要接收方确认,属于不可靠的传输,可能会出现丢包现象,实际应用中要求程序员编程验证。
UDP适用于DNS,视频音频等多媒体通信,广播通信(广播,多播)。例如我们常用的QQ,就是一个以UDP为主,TCP为辅的通讯协议。
UDP报文格式如下:
UDP首部有8个字节,由4个字段构成,每个字段都是两个字节,
- <李>
源端口:数据发送方的端口号。李李
> <>目的端口:数据接收方的端口号。
李> <李>长度:UDP数据报的整个长度(包括首部和数据),其最小值为8(只有首部)。
李> <李>校验和:检测UDP数据报在传输中是否有错,有错则丢弃。
李>可以使用数控发送UDP数据包:<代码>回声你好|数控紫外线127.0.0.1 9999 代码>。
用tcpdump抓取到的数据包如下(注意先运行tcpdump,然后再执行数控命令):
#, tcpdump 小姐;lo -X udp port 9999 tcpdump: verbose output 镇压,,use -v 或是-vv for full protocol 解码 listening 提醒lo, link-type EN10MB (以太网),capture size 262144字节 11:19:39.267912 IP  localhost.45666 祝辞,localhost.distinct:, UDP, length 6 0 x0000:, 4500, 0022, 5914, 4000, 4011, e3b4 7 f00 0001年,E . .“Y .@ .@ ....... 0 x0010: 7 f00 0001年,b262 270 f 000 e fe21 6865年,6 c6c ..... b # 39; .... !地狱 0 x0020: 6 f0a ,,, o。 …,…
说明:
- <李>
源端口:0 xb262,十进制的45666 .
李> <李>目的端口:0 x270f,十进制的9999 .
李> <李>长度:0 x000e, 14个字节的报文长度。
李> <李>校验和:0 xfe21。
李>生物之单播
单播就是一对一通信。
服务器端代码如下:
package com.morris.udp.bio.single; import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; public class  Server { ,public static  void main (String [], args), throws IOException { ,DatagramSocket DatagramSocket =, new DatagramSocket (9999); ,byte [], bytes =, new 字节[1024]; ,DatagramPacket DatagramPacket =, new DatagramPacket(字节,,bytes.length); ,datagramSocket.receive (datagramPacket); ,System.out.println (“receive 得到客户:,“,+,new 字符串(字节)); ,byte [], req =,“hello client" .getBytes (); ,DatagramPacket resp =, new DatagramPacket(点播,req.length,, datagramPacket.getSocketAddress ()); ,datagramSocket.send(职责); ,} }
客户端代码如下:
package com.morris.udp.bio.single; import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetSocketAddress; public class  Client { ,public static  void main (String [], args), throws IOException { ,DatagramSocket DatagramSocket =, new DatagramSocket (); ,byte [], req =,“hello server" .getBytes (); ,DatagramPacket DatagramPacket =, new DatagramPacket(点播,req.length,, new InetSocketAddress (“127.0.0.1",, 9999)); ,datagramSocket.send (datagramPacket); ,datagramSocket.receive (datagramPacket); ,System.out.println (“receive 得到服务器:,“,+,new 字符串(datagramPacket.getData ())); ,} }
客户端和服务端的代码几乎一致,只不过接收和发送数据的顺序不一致,接收和发送都欧式阻塞方法。
生物之广播
广播:同一网段所有主机都能接收,前提是端口要开启监听。
只需要将单播的例子中客户端发送数据的IP修改为<代码> 255.255.255.255> 代码即可,具体修改如下:
DatagramPacket DatagramPacket =, new DatagramPacket(点播,req.length,, new InetSocketAddress (“255.255.255.255",, 9999));如何在java中的使用UDP协议