Java UDP 网络编程


UDP 网络编程

  • UDP 和 TCP 一样,都属于网络中传输层的协议,和 TCP 不同的是,UDP 是一种相对不可靠的传输控制协议。采用 UDP 方式进行通信时,不需要先建立连接,故而速度快。数据发送时需要封装成数据包,就像把信件装入信封一样;

1. DatagramPacket 类

  • UDP 是一种面向无连接的协议,因此,在通信时发送端和接收端不用建立连接。JDK 中提供了 DatagramPacket 类,该类的实例对象就相当于一个集装箱,用于封装 UDP 通信中发送或者接收的数据;
  • 想要创建一个 DatagramPacket 对象,首先需要了解一下它的构造方法。在创建发送端和接收端的 DatagramPacket 对象时,使用的构造方法有所不同,接收端的构造方法只需要接收一个字节数组来存放接收到的数据,而发送端的构造方法不但要接收存放了发送数据的字节数组,还需要指定发送端的 IP 地址和端口号;
  • DatagramPacket 类中常用的构造方法:
    (1)DatagramPacket(byte[] buf,int length)
    (2)DatagramPacket(byte[] buf,int length,InetAddress addr,int port)
    (3)DatagramPacket(byte[] buf,int offset,int length)
    (4)DatagramPacket(byte[] buf,int offset,int length,InetAddress addr,int port)
  • java.net.DatagramPacket,详见:Class DatagramPacket

2. DatagramSocket 类

  • 使用该类的实例对象就可以发送和接收 DatagramPacket 数据包;
    在这里插入图片描述
  • DatagramSocket 类中常用的构造方法:
    (1)DatagramSocket()
    (2)DatagramSocket(int port)
    (3)DatagramSocket(int port,InetAddress addr)
  • java.net.DatagramSocket,详见:Class DatagramSocket

3. UDP 网络编程

  • UDP 和 TCP 实现的功能类似,要求服务器端和客户端能够正常进行网络通信,故而程序也分为服务器端和客户端两部分;

a. 使用 UDP 协议进行网络通信

i. 服务器端

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

public class ServerTest {
    public static void main(String[] args) {
        DatagramSocket socket = null;
        DatagramPacket packet_send = null;
        DatagramPacket packet_receive = null;
        int port = 5151; // 服务器监听端口号
        try {
            socket = new DatagramSocket(port); // 创建连接对象
            System.out.println("服务器启动!");
            byte[] r = new byte[1024]; // 创建缓存数组
            packet_receive = new DatagramPacket(r, r.length); // 创建数据包对象
            socket.receive(packet_receive); // 接收数据包
            InetAddress client_ip = packet_receive.getAddress(); // 客户端地址
            int client_port = packet_receive.getPort(); // 客户端的端口号
            byte[] data = packet_receive.getData(); // 客户端字节数据
            int len = packet_receive.getLength(); // 数据有效长度
            String str1 = new String(data, 0, len); // 将字节数据转换成字符串
            System.out.println("客户机" + client_ip + ":" + client_port + "\n 发送的信息是:" + str1);
            String response = "Hello,I am Server B";
            byte[] s = response.getBytes();
            packet_send = new DatagramPacket(s, s.length, client_ip, client_port);// 创建响应数据包对象
            socket.send(packet_send); // 发送响应数据包
        } catch (Exception e) {
            System.out.println(e);
        } finally {
            socket.close();
        }
    }
}

ii. 客户端

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

public class ClientTest {
    public static void main(String[] args) {
        DatagramSocket socket = null;
        DatagramPacket packet_send = null;
        DatagramPacket packet_receive = null;
        String server = "127.0.0.1"; // 服务器端IP 地址
        int port = 5151; // 服务器端的端口号
        String str = "Hello,I am Client A";
        byte[] data = str.getBytes(); // 将发送信息转换成字节数组
        try {
            socket = new DatagramSocket(); // 创建连接socket 对象
            InetAddress addr = InetAddress.getByName(server);
            // 将服务器端IP 地址封装成InetAddress 对象
            packet_send = new DatagramPacket(data, data.length, addr, port); // 创建数据包对象
            socket.send(packet_send); // 向服务器端发送数据
            byte[] r = new byte[1024]; // 设置接收缓冲区
            packet_receive = new DatagramPacket(r, r.length); // 创建数据包对象
            socket.receive(packet_receive); // 接收数据包
            byte[] response = packet_receive.getData(); // 读取数据包中的数据信息
            int len = packet_receive.getLength(); // 获取数据长度
            String str1 = new String(response, 0, len); // 将字节数据转换成字符串
            System.out.println("服务器响应的信息是:" + str1);
        } catch (Exception e) {
            System.out.println(e);
        } finally {
            socket.close();
        }
    }
}

iii. 运行演示

  • 先运行服务器端:
    在这里插入图片描述
  • 然后运行客户端:
    在这里插入图片描述
    在这里插入图片描述
发布了277 篇原创文章 · 获赞 281 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/Regino/article/details/105035932