Java笔记(14) UDP通讯程序Demo

实现一个简单的UDP通信程序,仅作为笔记使用
网络编程中有三要素:IP、端口号和通信协议,分别用来确定对方在互联网上的地址、指定接受数据的软件和确定数据在网络中传输的规则。

IP地址

IP地址分为IPv4地址和IPv6地址,这里不做讨论。
IPv4地址中分为公网地址(万维网使用)和私有地址(局域网使用)。192.168.开头的就是私有地址,范围是192.168.0.0--192.168.255.255。另外还有一个特殊地址:127.0.0.1,也可以是localhost,称为回送地址,也称本机IP。与在局域网中被分配的IPv4地址来说,该地址永远指向自身,而分配的IP地址,有可能随着连接时间和地点的变换而变换。

端口号

端口号是应用程序在设备中唯一的标识,有两个字节标识的整数组成,因此取值范围为065535。其中01023之间的端口固定用于一些知名的网络服务或者应用。一个端口号只能被一个应用占用。

协议

互联网通信协议分为OSI参考模型和TCP/IP参考模型,这里不做讨论。
两种运行在传输层的协议:

  • UDP协议:用户数据包协议(User Datagram Protocol)。UDP是面向无连接的通信协议。速度较快,但有大小限制,一次最多发送64k,是数据不安全的,易丢失数据。
  • TCP协议:传输控制协议(Transmission Control Protocol)。TCP协议是面向连接的通信协议。速度相较于UDP较慢,但没有大小限制,是数据安全的。

UDP通信程序流程

发送数据

  1. 创建发送端的 DatagramSocket对象
  2. 数据打包 DatagramPacket
  3. 发送数据
  4. 释放资源

接收数据

  1. 创建接收端的 DatagramSocket
  2. 接收打包好的数据
  3. 解析数据包
  4. 释放资源

UDP-Sender实现

public class SendMessageDemo {
    public static void main(String[] args) throws IOException {
        //1. 创建发送端的 DatagramSocket,空参表示不指定端口,随机使用可用端口
        DatagramSocket socket = new DatagramSocket();

        //2. 将数据封装进 DatagramPacket 对象中,作为发送者,需要指定接收方的IP和接受端口号
        String str = "Hello";
        byte[] bytes = str.getBytes();
        InetAddress address = InetAddress.getByName("HIIBIRD");//get target IP address
        DatagramPacket packet = new DatagramPacket(bytes, bytes.length, address, 10086);

        //3. 发送打包的数据包
        socket.send(packet);

        //4. 端口号资源是有限的,发送完成后释放端口号
        socket.close();
    }
}

UDP-Receiver实现

public class ReceiveMessageDemo {
    public static void main(String[] args) throws IOException {
        //1. 创建接收端的 DatagramSocket,作为接收方,需要指定使用哪个接口进行接受
        DatagramSocket socket = new DatagramSocket(10086);

        //2.接收打包好的数据,由于数据通过DatagramPacket对象发送,接收端也需要创建一个DatagramPacket对象来接收
        byte[] bytes = new byte[1024];
        DatagramPacket packet = new DatagramPacket(bytes, bytes.length);

        //这个方法是阻塞的,程序会一致在这里等待
        socket.receive(packet);

        //3. 解析数据,接收方可以得到以下信息:发送的数据包、数据长度、发送发地址、发送方使用的端口号
        byte[] data = packet.getData();
        int len = packet.getLength();
        InetAddress address = packet.getAddress();
        int port = packet.getPort();

        System.out.println("Received data: " + new String(data, 0, len));
        System.out.println("This data was send from " + port + "port of the " + address + " computer");

        //4. 释放资源
        socket.close();
    }
}

需要先运行接收端程序,接收程序阻塞等待接受数据。然后运行发送端程序,发送数据。

热门相关:桃花   时间都知道(唐嫣、窦骁、杨烁主演)   致灿烂的你   寂静王冠   天启预报