Red de conocimiento informático - Problemas con los teléfonos móviles - Comunicación UDP de comunicación Socket

Comunicación UDP de comunicación Socket

Hace algún tiempo, hablamos sobre múltiples procesos y métodos de comunicación entre procesos en este artículo. Hablamos principalmente sobre el uso de la comunicación de procesos en cola entre procesos locales. no En el mismo host, no podemos usar colas para comunicarnos, por lo que necesitamos usar Sockets.

Socket es un protocolo abstracto entre la capa de aplicación y la capa de transporte. Se puede utilizar para la comunicación entre procesos. Generalmente existen dos métodos de comunicación: UDP y TCP. estabilidad. No se pueden retransmitir los paquetes perdidos. Este último es un poco más lento, pero tiene buena estabilidad y puede retransmitir paquetes después de una pérdida.

Este artículo presenta primero el uso de Socket para la comunicación UDP.

El proceso de uso de Socket para la comunicación UDP es el siguiente:

A continuación se explicará en secuencia.

Para realizar la comunicación Socket, necesitamos usar el módulo socket. Primero, necesitamos crear un objeto Socket. Los siguientes son dos métodos de creación:

Si necesitamos enviar datos a otros hosts, debemos cambiar la dirección IP del host y el número de puerto correspondiente. Cuando se utiliza Socket para la comunicación, se deben escribir dos datos en una tupla. El primer elemento de la tupla es la dirección IP del host de destino y el segundo elemento es el número de puerto para recibir datos:

Entre ellos, IP La dirección usa el tipo de cadena y el número de puerto usa el tipo numérico.

Si el puerto no está vinculado, el sistema operativo asignará dinámicamente un puerto cada vez que se utilice el Socket. También podemos vincularlo a un puerto fijo. La ventaja de esto es: si queremos aceptar información de otros hosts, otros hosts pueden enviar datos directamente a este puerto. Si se utiliza un puerto dinámico, el remitente no sabe cuál es el puerto de destino, por lo que no puede enviar datos. el receptor.

Para vincular un puerto, necesita utilizar el método de vinculación del objeto Socket:

El método de vinculación acepta una tupla como parámetro. El primer elemento de la tupla es el enlace. Dirección IP, y el segundo elemento es el número de puerto vinculado. Podemos especificar el primer elemento como cualquier dirección IP en esta máquina, o configurarlo en una cadena vacía "" para representar cualquier dirección IP legal en esta máquina.

Cuando utilice el protocolo de socket UDP, envíe datos utilizando el método sendto del objeto Socket y reciba datos utilizando el método recvfrom del objeto Socket. Estos dos métodos se utilizan de la siguiente manera:

El método sendto acepta dos parámetros: los datos enviados y las tuplas de IP y puerto del host de destino. En Python3, los datos enviados deben convertirse a tipo byte y enviarse. En Python2, las cadenas se pueden enviar directamente.

recvfrom acepta un parámetro: el tamaño máximo de datos aceptado esta vez. Este método es de bloqueo y las operaciones posteriores solo se pueden realizar después de recibir datos.

Al igual que con un archivo, después de usar el socket, debes cerrarlo llamando al método close.

Arriba presentamos cómo usar Socket, hagamos un ejemplo de comunicación simplex (una parte es responsable de enviar información y la otra parte es responsable de recibir información).

Creemos aquí dos archivos: send.py para enviar información y recv.py para recibir información. La instancia se simula en una máquina virtual (tenga en cuenta que la máquina virtual está configurada en modo puente).

Crear send.py:

Crear recv.py:

Los resultados de ejecución son los siguientes:

Lo anterior implementa un simplex Ejemplo de comunicación: Una parte es responsable de enviar y la otra es responsable de recibir.

A continuación continuamos implementando un ejemplo de comunicación dúplex para que ambas partes puedan enviar y recibir mensajes.

Dado que el bucle while se utiliza para sondear continuamente al recibir y enviar mensajes, para lograr el envío y la recepción simultáneos, debemos realizar múltiples tareas.

Crea un nuevo msg.py:

Aquí usamos el puerto 3000 para enviar datos y el puerto 3001 para recibir datos. Al ejecutar el programa, solo necesita completar la dirección IP. del host objetivo para comunicarse.

Efecto de operación:

También podemos transmitir dentro de la LAN, simplemente agregue una configuración al Socket:

Al mismo tiempo, enviar una transmisión requiere una dirección de transmisión y el puerto para que el host de destino acepte transmisiones:

La configuración anterior solo puede enviar transmisiones a hosts en el segmento de red 0. Si desea enviar transmisiones a todos los hosts en la LAN, puede configúrelo así:

A continuación creamos un nuevo send.py para enviar transmisiones:

Crea un nuevo recv.py para recibir transmisiones:

El archivo en ejecución El efecto es como se muestra a continuación:

terminado.