【网络编程】4.UDP网络通信编程

1. DatagramSocket

1.1 基本介绍

UDP数据报通过数据报套接字DatagramSocket发送和接收,系统不保证UDP数据报一定能够安全送到目的地,也不能确定什么时候可以抵达。

1.2 类介绍

  • 构造方法

    • DatagramSocket(int port)
      • port:监听的端口
  • 成员方法

    • void send(DatagramPacket p)
      • 发送数据报
    • void receive(DatagramPacket p)
      • 接收数据报
    • void close()
      • 关闭套接字

2. DatagramPacket

2.1 基本介绍

DatagramPacket对象封装了UDP数据报,在数据报中包含额发送端IP地址和端口号以及接收端的IP地址和端口号。UDP协议中每个数据报都给出了完整的地址信息,因此无需建立发送方和接收方的连接。UDP传送数据最大64K。

2.2 类介绍

  • 构造方法
    • DatagramPacket(byte[] buf, int length)
      • 用于接收数据
      • buf:接收数据的数组
      • length:数组大小
    • DatagramPacket(byte[] buf, int length, InetAddress address, int port)
      • 用于发送数据
      • buf:接收数据的数组
      • length:数组大小
      • address: 接收端地址
      • port:接收端端口
  • 成员方法
    • byte[] getData()
      • 获取数据
    • int getLength()
      • 获取数据长度

3. 案例

在发送端通过控制台输入内容,接收端收到后,如果内容是“四大名著是哪些”则返回给接收端“四大名著是《红楼梦》、《西游记》、《三国演义》和《水浒传》”,如果是其他内容则返回给接收端“什么?”,发送端代码如下:

@Test
public void testSend() throws IOException {
    DatagramSocket datagramSocket = new DatagramSocket(8887);
    Scanner scanner = new Scanner(System.in);
    // 发送
    byte[] data = scanner.next().getBytes();
    DatagramPacket datagramPacket =
            new DatagramPacket(data, data.length, InetAddress.getByName("127.0.0.1"), 8888);
    datagramSocket.send(datagramPacket);
    // 接收
    data = new byte[64 * 1024];
    datagramPacket = new DatagramPacket(data, data.length);
    datagramSocket.receive(datagramPacket);
    int length = datagramPacket.getLength();
    System.out.println(new String(data, 0, length));
    datagramSocket.close();
}

接收端代码如下:

@Test
public void testReceive() throws IOException {
    DatagramSocket datagramSocket = new DatagramSocket(8888);
    // 接收
    byte[] data = new byte[64 * 1024];
    DatagramPacket datagramPacket = new DatagramPacket(data, data.length);
    datagramSocket.receive(datagramPacket);
    int length = datagramPacket.getLength();
    String s = new String(data, 0, length);
    System.out.println(s);
    // 发送
    if ("四大名著是哪些".equals(s)) {
        data = "四大名著是《红楼梦》、《西游记》、《三国演义》和《水浒传》".getBytes();
    } else {
        data = "什么?".getBytes();
    }
    datagramPacket = new DatagramPacket(data, data.length, InetAddress.getByName("127.0.0.1"), 8887);
    datagramSocket.send(datagramPacket);
    datagramSocket.close();
}
posted @ 2021-07-31 17:40  haojinglei  阅读(83)  评论(0)    收藏  举报