美文网首页
UDP-网络通信协议

UDP-网络通信协议

作者: 七喜丶 | 来源:发表于2021-09-09 13:27 被阅读0次
    Java中的UDP通信
    • 介绍:

      1. UDP协议是一种不可靠的网络协议,它在通信的两端各建立一个Socket对象,但是这两个Socket只是发送,接收数据的对象,因此对于基于UDP协议的通信双方而言,没有所谓的客户端和服务器的概念
      2. Java提供了DatagramSocket类作为基于UDP协议的Socket
    • 特点:

      1. UDP是无连接通信协议,即在数据传输时,数据的发送端和接收端不建立逻辑连接
      2. 消耗系统资源小,通信效率高,大小有限制64k
    • 通信实现:

    1. 通信模型


      通信方法(重要
      方法名 说明
      DatagramSocket()(重要 创建数据报套接字并将其绑定到本机地址上的任何可用端口
      DatagramPacket(byte[] buf,int len,InetAddress add,int port)(重要 创建数据包,发送长度为len的数据包到指定主机的指定端口
      void send(DatagramPacket p) 发送数据报包
      void close() 关闭数据报套接字
      void receive(DatagramPacket p) 从此套接字接受数据报包
    2. 发送数据的步骤:
      无需事先建立连接,只需指明地址,将数据发送过去就可以了

      • 创建发送端的Socket对象(DatagramSocket)
      • 创建数据,并把数据打包
      • 调用DatagramSocket对象的方法发送数据
      • 关闭发送端

      代码展示

    public class SendDemo {
        public static void main(String[] args) throws IOException {
            //创建发送端的Socket对象(DatagramSocket)
            // DatagramSocket() 构造数据报套接字并将其绑定到本地主机上的任何可用端口
            DatagramSocket ds = new DatagramSocket();
    
            //创建数据,并把数据打包
            //DatagramPacket(byte[] buf, int length, InetAddress address, int port)
            //构造一个数据包,发送长度为 length的数据包到指定主机上的指定端口号。
            byte[] bys = "hello,我来了".getBytes();
    
            DatagramPacket dp = new DatagramPacket(bys,bys.length,InetAddress.getByName("127.0.0.1"),10086);
    
            //调用DatagramSocket对象的方法发送数据
            //void send(DatagramPacket p) 从此套接字发送数据报包
            ds.send(dp);
    
            //关闭发送端
            //void close() 关闭此数据报套接字
            ds.close();
        }
    }
    //UDP(用户数据报)协议,其中数据报是网络传输的基本单元,包含一个报头(Header)和数据本身,其中报头中包含了目的地地址
    
    1. 接收数据的步骤:

      • .使用DatagramSocket对象接收数据报
      • 从DatagramPacket对象中取出数据
      • 释放资源
    public class ServerDemo {
        public static void main(String[] args) throws IOException {
          //创建DatagramSocket对象对应正确端口
            DatagramSocket ds = new DatagramSocket(10086);
          //创建DatagramPacket对象接收数据报
            DatagramPacket ap = null;
            while (true) {
                byte[] bytes = new byte[1024];
                ap = new DatagramPacket(bytes, bytes.length);
              //接收数据
                ds.receive(ap);
                System.out.println(new String(ap.getData(), 0, ap.getData().length));
            }
        }
    }
    
    1. UDP三种通信方式:
      单播:用于两个主机之间的端对端通信

    组播:用于对一组特定的主机进行通信

    • 广播:用于一个主机对整个局域网上所有主机上的数据通信

    1. 组播实现:
      组播地址:224.0.0.0~239.255.255.255
      其中:224.0.0.0~224.0.0.255为预留组播地址
      //client端(客户)
      public class ClinetDemo {
          public static void main(String[] args) throws IOException {
              DatagramSocket ds = new DatagramSocket();
              String s = "hello 组播";
              byte[] bytes = s.getBytes();
              InetAddress address = InetAddress.getByName("224.0.1.0");
              int port = 10000;
              DatagramPacket dp = new         
              DatagramPacket(bytes,bytes.length,address,port);
              ds.send(dp);
              ds.close();
          }
      }
      
      //server端(服务)
      public class ServerDemo {
      public static void main(String[] args) throws IOException {
          MulticastSocket ms = new MulticastSocket(10000);
          DatagramPacket dp = new DatagramPacket(new byte[1024],1024);
          //把当前计算机绑定一个组播地址,表示添加到这一组中.
          ms.joinGroup(InetAddress.getByName("224.0.1.0"));
          ms.receive(dp);
          byte[] data = dp.getData();
          int length = dp.getLength();
          System.out.println(new String(data,0,length));
          ms.close();
      }
      

    }
    ```

    主要
    组播与单播和广播的不同点是在于服务端的处理:
    组播的服务端是new MulticastSocket()对象并且使用了joinGroup()方法
    new MulticastSocket():其作用与DatagramSocket()大致相同
    joinGroup():是把组播地址分为一组接收此地址的数据包

    1. 广播实现:
      广播地址:255.255.255.255
      //client(客户)
      public class ClientDemo {
          public static void main(String[] args) throws IOException {
              DatagramSocket ds = new DatagramSocket();
              String s = "广播 hello";
              byte[] bytes = s.getBytes();
              InetAddress address = InetAddress.getByName("255.255.255.255");
              int port = 10000;
              DatagramPacket dp = new       
              DatagramPacket(bytes,bytes.length,address,port);
              ds.send(dp);
              ds.close();
        }
      }
        //server (服务)
      public class ServerDemo {
          public static void main(String[] args) throws IOException {
              DatagramSocket ds = new DatagramSocket(10000);
              DatagramPacket dp = new DatagramPacket(new byte[1024],1024);
              ds.receive(dp);
              byte[] data = dp.getData();
              int length = dp.getLength();
              System.out.println(new String(data,0,length));
              ds.close();
          }
      }
      

    相关文章

      网友评论

          本文标题:UDP-网络通信协议

          本文链接:https://www.haomeiwen.com/subject/gnpiwltx.html