UDP网络通信编程

SOBER大约 2 分钟

UDP网络通信编程

基本介绍

  1. 类 DatagramSocket 和 DatagramPacket 实现了基于 UDP 协议网络程序。
  2. UDP 数据报通过数据报套接字 DatagramSocket 发送和接收,系统不保证 UDP 数据报一定能够安全送到目的地,也不能确定什么时候可以抵达。
  3. DatagramPacket 对象封装了 UDP 数据报,在数据报中包含了发送端的 IP 地址和端口号以及接收端的 IP 地址和 端口号。
  4. UDP 协议中每个数据报都给出了完整的地址信息,因此无须建立发送方和接收方的连接

基本流程

  1. 核心的两个类/对象 DatagramSocket 与 DatagramPacket
  2. 建立发送端,接收端
  3. 建立数据包
  4. 调用 DatagramSocket 的发送、接收方法
  5. 关闭 DatagramSocket

案例

  1. 编写一个接收端 A, 和一个发送端 B
  2. 接收端 A 在 9999 端口等待接收数据(receive)
  3. 发送端 B 向接收端 A 发送 数据 "helo,明天吃火锅~
  4. 接收端 A 接收到 发送端 B 发送的数据,回复 " 好的,明天见",再退出
  5. 发送端接收 回复的数据,再退出
package commonUDP;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;

public class ReceiverA {
    public static void main(String[] args) throws IOException {

        // 1. 创建一个 DatagramSocket 对象,准备在 9999 接收数据
        DatagramSocket socket = new DatagramSocket(9999);

        //2.构建一个 DatagramPacket 对象,准备接收数据在
        //  前面讲解 UDP 协议时,说过一个数据包最大 64k
        byte[] buf = new byte[1024];
        DatagramPacket packet = new DatagramPacket(buf, buf.length);

        //3.调用 接收方法,将通过网络传输的 DatagramPacket 对象
        //  填充到 packet 对象
        //提示: 当有数据包发送到本机的 9999 端口时,就会接收到数据
        //     如果没有数据包发送到本机的9999端口,就会阻塞等待。
        System.out.println("接收端A 等待接受数据。。。");
        socket.receive(packet);

        // 4. 可以把 packet 进行拆包,取出数据,并显示
        int length = packet.getLength(); // 实际接收到的数据字节长度
        byte[] data = packet.getData(); // 接收到数据
        String s = new String(data, 0, length);
        System.out.println(s);
    }
}


package commonUDP;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;

public class SenderB {
    public static void main(String[] args) throws IOException {

        // 1.创建 DatagramSocket 对象,准备在9998端口 接收数据
        DatagramSocket socket = new DatagramSocket(9998);

        // 2.将需要发送的数据,封装到 DatagramPacket 对象
        byte[] data = "hello 明天吃火锅".getBytes();
        // 说明: 封装的 DatagramPacket 对象 data 内容字节数组, data.length, 主机(IP), 端口
        DatagramPacket packet = new DatagramPacket(data, data.length, InetAddress.getByName("192.168.10.5"), 9999);
        socket.send(packet);

        // 关闭资源
        socket.close();
        System.out.println("退出");
    }
}