Usa UDP para hacer un chat

Antes de crear un dispositivo de chat UDP, necesitamos agregar algunos conocimientos. Primero, entendamos qué es UDP:

¿Qué es UDP?
            El nombre completo de UDP es User Datagram Protocol. En chino, User Datagram Protocol. Es un protocolo de capa de transporte sin conexión en el conjunto de protocolos de Internet, que proporciona servicios de transmisión orientados a transacciones simples y poco confiables. En pocas palabras, es un protocolo de transporte en la capa de transporte. No es necesario establecer una conexión por adelantado como TCP antes de la transmisión. Si se compara TCP con el "" "modo de teléfono", entonces UDP se puede comparar con el "modo de escritura de letra . "
  
Tenemos una comprensión general de la definición de UDP, luego echemos un vistazo a las características del "modo de escritura de carta":
   1. Falta de confiabilidad:
      UDP utiliza los mejores esfuerzos para entregar, pero no garantiza el éxito de la entrega. En otras palabras, no se puede garantizar la integridad y accesibilidad de los datos transmitidos a través del protocolo udp. Por lo tanto, el host no necesita mantener relaciones de conexión complejas. En términos sencillos, el sobre que envía por correo puede perderse en el camino.
 2. Sin conectividad:
      udp es sin conexión, es decir, no es necesario crear una conexión cuando se comunica, y la capa de transporte del host de destino no da una confirmación después de recibirla. Da un ejemplo que no sea muy apropiado: cuando escribes una carta, no debes saludar a la otra parte de antemano.
3. Orientado a mensajes:
      no modifique los mensajes que vienen de la capa de aplicación y los mensajes entregados a la capa de red IP, agregue / elimine directamente el encabezado y continúe con el siguiente paso. Si el mensaje es demasiado largo, se fragmentará en la capa ip; si el mensaje es demasiado corto, el encabezado del datagrama en la capa ip será muy largo. En la actualidad, existen algunas oficinas de correos que brindan un servicio completo, es decir, siempre y cuando compre sellos en esta oficina, solo debe enviar el contenido para ser enviado por correo al escribir una carta. El resto será manejado por la oficina de correos. .
4. Sin mecanismo de congestión:
      La velocidad de transmisión del host de origen no se reducirá después de la congestión de la red, lo cual es muy importante para algunas aplicaciones en tiempo real. Como teléfono IP, video en tiempo real, etc. Al mismo tiempo, se permite perder algunos datos en la congestión de la red, pero no se permite tener demasiado retraso de datos. Por ejemplo, ha recibido muchos sobres, pero alguien todavía necesita enviarle una carta en este momento, enviará la carta como de costumbre y no detendrá sus actividades porque ha recibido muchas cartas.
5. El
      remitente del cliente y el servidor sin un sentido claro también puede recibir cartas, y el destinatario también puede enviar cartas.
6. Admite comunicación interactiva uno a uno, uno a muchos, muchos a uno, muchos a muchos
7. La sobrecarga del encabezado es pequeña, solo 8 bytes,
hay una pregunta repentina, ¿cuál es el encabezado? ? No se preocupe, echemos un vistazo a la composición de UDP y lo entenderá.
UDP consta de dos partes, una es el campo de encabezado y la otra es el campo de datos . Aquí solo introduzca el campo de encabezado: el
campo de encabezado tiene solo 8 bytes, divididos en 4 campos:
  puerto de  origen : número de puerto de origen. Elija cuándo necesita que la otra parte responda y use todo 0 cuando no lo necesite.
  Puerto de destino : número de puerto de destino. Usado al final de la entrega.
  Longitud: la longitud del   datagrama de usuario udp, el valor mínimo es 8 (solo el encabezado).
  Suma de comprobación : compruebe si hay algún error en la transmisión del datagrama de usuario udp y deséchelo si hay algún error.
Además, también necesitamos saber un poco sobre ip y puerto:   ¿Qué es una
dirección IP
?
    ip es equivalente a "número de teléfono móvil", que se utiliza para marcar una computadora en la red, como 192.168.1.1. Es único en la red de área local. Cada dirección IP consta de dos partes: número de red (marcado con la dirección de red) y número de host (marcado con la dirección del host) Hay cinco tipos de ABCDE.
  ¿Cómo comprobar la IP?
            comando de terminal liunx

ifconfig

           Comando cmd de Windows

ipconfig

  Clasificación de IP
      I Pv4 e IP6
          ipv4 se componen de cuatro grupos de números, y cada grupo de números debe estar entre 0 y 255. En otras palabras, hay un total de 256 ** 3 direcciones ipv4.
         
Puerto (puerto)
  ¿Qué es un puerto?
     Los puertos se utilizan para marcar aplicaciones en el host. Cada aplicación tiene un
  número de puerto diferente . Hay dos tipos de números de puerto :
     puertos conocidos: puertos conocidos
        , que van del 0 al 1023. Por ejemplo, el número de puerto HTTP es 80 y el número de puerto FTP es 21.
      Puertos dinámicos (puertos dinámicos):
         cuando el programa necesita comunicación de red, el host asignará un puerto al programa desde los puertos disponibles, es decir, asignación dinámica. El número de puerto se publica al mismo tiempo cuando finaliza el programa. El número de puerto dinámico varía de 1024 a 65535.

Finalmente, echemos un vistazo a los sockets:

¿Qué es socket (socket)?
        Socket es una forma de comunicación de proceso, que puede realizar la comunicación de proceso entre diferentes hosts. En la actualidad, la mayoría de los servicios en la red se basan en socket para completar la comunicación.

OK, entonces vamos a ingresar al tema y comenzar a escribir la máquina de chat.

En primer lugar, solucionemos el proceso:

1. Crea un objeto socket

2. Información local vinculante

4. Enviar datos

5. Recibir y procesar datos

6. Imprimir datos

7. Cierre el objeto socket

 

1. Importe el módulo de socket

import socket

2. Crea un objeto socket

udp_socket = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)

Nota:

El socket requiere dos parámetros al crear un socket: socket (AddressFamily, Type)

AdressFamily : Puede elegir AF_INET (utilizado para la comunicación entre procesos de Internet) o AF_UNIX (comunicación entre procesos en la misma máquina). En la práctica, AF_INET
Tipo : SOCK_STREAM (socket de flujo, utilizado principalmente para el protocolo TCP) o SOCK_DGRAM (datagrama) Socket, principalmente utilizando el protocolo UDP).

Aquí necesitamos comunicación de red y usamos el protocolo udp, por lo que los dos parámetros son AF_INET y SOCK_DGRAM.

3. Información local vinculante

local_adress = ("",1314)
udp_socket.bind(local_adress)

Utilice el método bind () para vincular la información local del objeto socket. Se requiere un parámetro de tupla. La tupla contiene dos elementos. El primer elemento es la dirección IP del tipo de cadena y el segundo elemento es el número entero. Número de puerto (configurado por usted mismo, pero debe ser mayor que 1023, es decir, use uno de los puertos dinámicos).

4. Enviar datos

dest_ip = input("请输入对方IP:")
dest_port = int(input("请输入对方端口号:"))
send_data = input("请输入内容:")
udp_socket.sendto(send_data.encode("ASCII"),(dest_ip,dest_port))

El socket llama al método sendto () en el objeto para enviar datos, y el método sendto () requiere dos parámetros. El primer parámetro son los datos que se enviarán (tenga en cuenta la necesidad de transcodificación); el segundo es un parámetro de tipo tupla con dos elementos: el primer elemento es la dirección IP del host de destino y el segundo elemento es el número de puerto del host de destino . Tenga en cuenta que dest_port usa conversión int porque el número de puerto debe ser un número entero.

5. Recibir y procesar datos

recv_data = udp_socket.recvfrom(1024)
recv_msg =recv_data[0].decode("ASCII")
recv_adress = recv_data[1]

Utilice el método recvfrom () para recibir datos. Los datos recibidos son un tipo de tupla con dos elementos: el primero es el contenido recibido y el segundo es una tupla (ip y puerto). En este momento, recv_data es un tipo de tupla. Puede usar el índice para leer su contenido interno por separado, o puede usar el método de desempaquetado para recibir datos de recvfrom (). El primer método usado aquí. Además, es necesario decodificar el contenido recibido.

6. Imprimir datos

 print("来自【%s】的数据:\n%s" % (str(recv_adress),recv_msg))

% s es un tipo de carácter y recv_adress es un tipo de tupla, por lo que debe convertirse en tipo.

7. Cierre el objeto socket

udp_socket.close()

El código completo es el siguiente:

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Created on Sun Mar 15 20:38:15 2020

@author: x
"""
import socket

def sending_data(udp_socket):
     dest_ip = input("请输入对方IP:")
     dest_port = int(input("请输入对方端口号:"))
     send_data = input("请输入内容:")
     udp_socket.sendto(send_data.encode("ASCII"),(dest_ip,dest_port))


def recving_data(udp_socket):
    recv_data = udp_socket.recvfrom(1024)
    recv_msg =recv_data[0].decode("ASCII")
    recv_adress = recv_data[1]
    
    return recv_msg,recv_adress
    
    
def main():
    # 1.创建套接字对象
    udp_socket = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
    
    # 2.绑定本地信息
    local_adress = ("",1314)
    udp_socket.bind(local_adress)
    
    while True:
        # 3.发送数据
        sending_data(udp_socket)
       
        # 4.接收并处理数据
        recv_msg,recv_adress = recving_data(udp_socket)
        
        # 5.打印数据
        print("来自【%s】的数据:\n%s" % (str(recv_adress),recv_msg))
        
    # 6. 关闭套接字
    udp_socket.close()
    
if __name__ == "__main__":
    main()

¡Sígueme y muéstrame Python!

Supongo que te gusta

Origin blog.csdn.net/qq_45807032/article/details/104937087
Recomendado
Clasificación