你的位置:首页 > Java教程

[Java教程]黑马程序员【网络编程之UDP协议】


                                             UDP协议

    UDP(User Datagram Protocol)也就是用户数据报协议,是一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务,IETF RFC 768是UDP的正式规范。

    提到无连接数据传输,那我们首先想到的就是不可靠,数据丢失等等,那么在我们的日常软件中,UDP协议到底都应用在什么场景上呢?举一个大家比较熟悉的例子,就是我们平时所用的聊天软件,因为我们的聊天软件所传输的数据并非是重要数据。

    通过ip和端口号,我们可以实现一个小的聊天软件,有兴趣的朋友可以在局域网内通过该软件聊天,安全无插件。好了 废话不多说,我们直接上代码:

//发送端public class UdpSend {  public static void main(String[] args) throws IOException {    // TODO Auto-generated method stub    Scanner input = new Scanner(System.in);    DatagramSocket ds = new DatagramSocket();    System.out.println("请输入聊天语句:");    String name = input.next();    byte[] b = name.getBytes();    DatagramPacket dp = new DatagramPacket(b, b.length, InetAddress        .getByName("192.168.15.80"), 10000);    ds.send(dp);    ds.close();  }}

//接收端public class UdpReceive {  public static void main(String[] args) throws IOException {    // TODO Auto-generated method stub    DatagramSocket ds = new DatagramSocket(10000);    byte[] b = new byte[1024];    DatagramPacket dp = new DatagramPacket(b, b.length);    ds.receive(dp);    String data = new String(dp.getData(), 0, dp.getLength());    System.out.println(data);  }}

    我用的是MyEclipse写的代码,有兴趣的童鞋直接粘过去就能用,但是使用时大家会发现一个很明显的缺点,就是只能发送或接受一次程序就运行结束了,这样要怎么解决呢?我的解决方案是在外侧套上一个while(true)的循环,通过条件判断何时退出程序,听起来很简单,可是在加循环的时候要注意一点,就是位置问题,要特别注意的是不能将所有代码一股脑的放到循环中,因为DatagramSocket对象如果放到循环中,那么下次循环执行时就不再是同一对象。正确修改代码如下:

//发送端public class UdpSend {  public static void main(String[] args) throws IOException {    // TODO Auto-generated method stub    Scanner input = new Scanner(System.in);    DatagramSocket ds = new DatagramSocket();    while (true) {      System.out.println("请输入聊天语句:");      String name = input.next();      byte[] b = name.getBytes();      DatagramPacket dp = new DatagramPacket(b, b.length, InetAddress          .getByName("192.168.0.3"), 10000);      ds.send(dp);      if (name.equals("结束")) {        break;      }    }    ds.close();  }}

//接收端public class UdpReceive {  public static void main(String[] args) throws IOException {    // TODO Auto-generated method stub    DatagramSocket ds = new DatagramSocket(10000);    while (true) {      byte[] b = new byte[1024];      DatagramPacket dp = new DatagramPacket(b, b.length);      ds.receive(dp);      String data = new String(dp.getData(), 0, dp.getLength());      System.out.println(data);    }  }}

    这样一个可以一直在局域网内聊天的小程序就完成了。因为UDP的不可靠性,数据包在传输时会发生跳变,可能发生不可预知的错误。