UDP-网络通信协议

2021-09-09  本文已影响0人  七喜丶
Java中的UDP通信
  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();
        }
    }
    
上一篇下一篇

猜你喜欢

热点阅读