如何在java中的使用UDP协议

  介绍

本篇文章为大家展示了如何在java中的使用UDP协议,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。

UDP是面向无连接的通讯协议,由于通讯不需要连接,所以可以实现广播发送.UDP通讯时不需要接收方确认,属于不可靠的传输,可能会出现丢包现象,实际应用中要求程序员编程验证。

UDP适用于DNS,视频音频等多媒体通信,广播通信(广播,多播)。例如我们常用的QQ,就是一个以UDP为主,TCP为辅的通讯协议。

UDP报文格式如下:

如何在java中的使用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协议