Comunicación UDP en Java

1 mecanismo de comunicación UDP

El conjunto de protocolos de Internet admite un protocolo de transporte sin conexión llamado Protocolo de datagramas de usuario ( UDP ). A diferencia del protocolo TCP, UDP proporciona una forma para que las aplicaciones envíen paquetes IP encapsulados sin establecer una conexión. Antes de enviar datos, debe realizar una operación de paquete (usando la clase DatagramPacket) para enviar y recibir datos (usando la clase DatagramSocket).

Al utilizar UDP para transmitir datos, los posibles problemas incluyen:

Paquete perdido;

fuera de servicio;

paquete de error;

Envío repetido de paquetes de datos.

Los escenarios que generalmente requieren el uso de UDP son principalmente cuando los requisitos para el flujo de datos no son altos, como transmisión de video, transmisión de audio, etc.

2 Pasos generales para la programación de comunicaciones UDP

  • Cree el DatagramSocket del cliente y defina el puerto utilizado por el cliente para recibir mensajes;

  • Cree un DatagramSocket en el lado del servidor y defina el puerto utilizado por el servidor para recibir mensajes;

  • Cree un objeto DatagramPacket en el lado del servidor para encapsular el paquete de datos que se enviará;

  • El cliente envía el mensaje;

  • El servidor recibe el mensaje.

3 servidor

El servidor utiliza DatagramSocketun objeto para recibir datos. Al crear un objeto, debe especificar un puerto para recibir solicitudes.

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

public class UdpServer {
    public static void main(String[] args) {
        try {
            //创建服务端接收数据的 DatagramSocket 对象
            DatagramSocket datagramSocket = new DatagramSocket(5555);
            //创建数据缓冲区
            byte[] buff = new byte[1024];
            //创建数据报的包对象
            DatagramPacket packet = new DatagramPacket(buff, buff.length);
            //等待接收客户端发送的数据
            datagramSocket.receive(packet);
            //获取数据
            String input = new String(packet.getData(), 0, packet.getLength());

            System.out.println("接收到客户端的请求: " + input);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

Al recibir solicitudes del cliente, se utiliza un búfer de bytes, que puede recibir 1024 bytes de datos a la vez, lo que puede reducir las operaciones de E/S de la red.

El flujo de datos entre el servidor y el cliente utiliza DatagramPacketencapsulación, por lo que al recibir datos, este objeto debe usarse para recibirlos.

datagramSocket.receive(packet);El método es un método de bloqueo. Cuando no se reciben datos, el programa esperará aquí. Después de recibir los datos, continuará ejecutando el siguiente código.

Después de recibir los datos de bytes, si no desea utilizar datos binarios directamente, debe convertir los datos.

Al obtener los datos recibidos, new String(packet.getData(), 0, packet.getLength())no se lee todo el contenido del búfer, porque cuando los datos reales leídos de la tarjeta de red son menores que la longitud del búfer, los datos no están disponibles para el servidor. Sólo necesitamos tomar el datagrama recibido real.

4 clientes

Al crear el cliente, también necesita crear un objeto DatagramSocket y especificar el puerto para enviar datos. Si el cliente está en la misma máquina que el servidor, el puerto debe ser diferente al del servidor.

Cuando el cliente envía datos, los datos deben encapsularse en un objeto DatagramPacket y se deben especificar la IP del servidor y el puerto para recibir los datos.

import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetSocketAddress;
import java.util.Scanner;

public class UdpClient {
    public static void main(String[] args) {
        try {
            //创建数据发送对象,并指定要发送数据的端口
            DatagramSocket socket = new DatagramSocket(5556);
            //将要发送的数据转换为字节数组
            Scanner scanner = new Scanner(System.in);
            String output = scanner.next();
            byte[] bytes = output.getBytes();
            //创建数据报的包对象
            DatagramPacket packet = new DatagramPacket(bytes, bytes.length, new InetSocketAddress("127.0.0.1", 5555));
            //发送消息
            socket.send(packet);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

5 comunicación

5.1 No iniciar el servidor

Cuando el servidor no se inicia y solo el cliente comienza a enviar datos, el cliente envía los datos normalmente sin informar un error.

imagen.png

Se puede ver que el cliente no verificó el servidor al enviar datos.

5.2 Iniciar el servidor

imagen.png

Esta es una comunicación. Si desea establecer múltiples comunicaciones, puede agregar un bucle en el lado del servidor. El método es similar a la comunicación TCP.

Supongo que te gusta

Origin blog.csdn.net/QQ156881887/article/details/129854182
Recomendado
Clasificación