Red de conocimiento informático - Problemas con los teléfonos móviles - Problemas con python udp enviando datos

Problemas con python udp enviando datos

Una programación simple de sockets en Python

1. Sockets

Los sockets son para protocolos de red específicos (como TCP/IP, ICMP/IP, UDP/IP, etc.) la suite proporciona objetos para los estándares portátiles actuales a los proveedores de aplicaciones de red. Permiten que los programas acepten y realicen conexiones, como enviar y recibir datos. Para establecer un canal de comunicación, es extremadamente importante que cada punto final de la comunicación de la red tenga un objeto socket.

Los sockets son parte del sistema central BSD UNIX y también son adoptados por muchos otros sistemas operativos similares a UNIX, incluido Linux. Muchos sistemas UNIX que no son BSD (como ms-dos, windows, os/2, mac os y la mayoría de los entornos host) brindan soporte para sockets en forma de bibliotecas.

Los tres tipos de sockets más populares son: flujo, datagrama y sin formato. Los sockets de flujo y datagramas pueden interactuar directamente con el protocolo TCP, mientras que el socket sin formato interactúa con el protocolo IP. Pero los sockets no se limitan a TCP/IP.

2. Módulo de socket

El módulo de socket es una interfaz muy simple basada en objetos que proporciona acceso a redes estilo socket BSD de bajo nivel. Los sockets de cliente y servidor se pueden implementar utilizando este módulo. Para configurar un servidor simple con TCP y sockets de transmisión en Python, necesita usar el módulo de socket. Este módulo contiene definiciones de funciones y clases que le permiten crear programas que se comunican a través de una red. En términos generales, se requieren seis pasos para establecer una conexión con el servidor.

El primer paso es crear el objeto socket. Llame al constructor del socket.

socket=socket.socket(familia, tipo)

El valor de la familia puede ser AF_UNIX (dominio Unix, utilizado para la comunicación entre procesos en la misma máquina) o AF_INET ( Para TCP y UDP del protocolo IPV4), en cuanto al parámetro de tipo, SOCK_STREAM (socket de flujo) o SOCK_DGRAM (socket de mensaje de datos), SOCK_RAW (socket sin formato).

El segundo paso es vincular (asignar) el socket a la dirección especificada, socket.bind(address)

la dirección debe ser una tupla de dos elementos, ((host, port )), nombre de host o número de puerto de dirección IP. Si el número de puerto está en uso o reservado, o el nombre de host o la dirección IP son incorrectos, se genera una excepción socket.error.

Paso 3. Después de la vinculación, el socket debe estar preparado para aceptar solicitudes de conexión.

socket.listen(backlog)

El backlog especifica el número máximo de conexiones, que es al menos 1. Después de recibir solicitudes de conexión, estas solicitudes deben ponerse en cola si la cola está llena. , la solicitud será rechazada.

Paso 4. El socket del servidor espera a que el cliente solicite una conexión a través del método de aceptación del socket:

conexión, dirección=socket.accept()

Llamada Al aceptar el método, el socket entrará en el estado de 'espera' (o bloqueo). Cuando el cliente solicita una conexión, el método establece la conexión y regresa al servidor. El método de aceptación devuelve una tupla que contiene dos elementos, en forma de (conexión, dirección). El primer elemento (conexión) es el nuevo objeto socket a través del cual el servidor se comunica con el cliente; el segundo elemento (dirección) es la dirección de Internet del cliente.

El paso 5 es la etapa de procesamiento, donde el servidor y el cliente se comunican (transmiten datos) a través de los métodos de envío y recepción.

El servidor llama a enviar y envía información al cliente en forma de cadena. El método de envío devuelve el número de caracteres enviados. El servidor utiliza el método recv para recibir información del cliente. Al llamar a recv, debe especificar un número entero para controlar la cantidad máxima de datos aceptados por esta llamada. El método recv entrará en el estado 'bloqueo' al aceptar datos y finalmente devolverá una cadena para representar los datos recibidos. Si la cantidad enviada excede la recv, los datos se truncarán. El exceso de datos se almacenará en el extremo receptor. Cuando se llama a recv más tarde, los datos sobrantes se eliminarán del búfer.

Paso 6, se completa la transmisión y el servidor llama al método de cierre del socket para cerrar la conexión.

Establecer una conexión de cliente sencilla requiere 4 pasos.

Paso 1, cree un socket para conectarse al servidor socket=socket.socket(familia, tipo)

Paso 2, use el método de conexión del socket para conectarse al servidor socket.connect(( host, port))

En el paso 3, el cliente y el servidor se comunican a través de los métodos de envío y recepción.

Paso 4. Una vez completado, el cliente cierra la conexión llamando al método de cierre del socket.

Pasos para escribir un servidor en Python:

El primer paso es crear un objeto socket. Llame al constructor del socket. Por ejemplo:

socket = socket.socket(familia, tipo)

El parámetro de familia representa la familia de direcciones, que puede ser AF_INET o AF_UNIX. La familia AF_INET incluye direcciones de Internet y la familia AF_UNIX se utiliza para la comunicación entre procesos en la misma máquina.

El parámetro tipo representa el tipo de socket, que puede ser SOCK_STREAM (socket de flujo) y SOCK_DGRAM (socket de datagrama).

El segundo paso es vincular el socket a la dirección especificada. Esto se logra mediante el método de vinculación del objeto de socket:

socket.bind(address)

Para el socket creado por AF_INET, la dirección debe ser una tupla de dos elementos. el formato es (host, puerto). host representa el host y puerto representa el número de puerto. Si el número de puerto está en uso, el nombre de host es incorrecto o el puerto se ha reservado, el método de vinculación generará una excepción socket.error.

El tercer paso es utilizar el método de escucha del socket para recibir la solicitud de conexión.

socket.listen( backlog )

El backlog especifica el número máximo de clientes permitidos para conectarse al servidor. Su valor es al menos 1. Después de recibir solicitudes de conexión, estas solicitudes deben ponerse en cola. Si la cola está llena, la solicitud se rechaza.

El cuarto paso es que el socket del servidor espera a que el cliente solicite una conexión a través del método de aceptación del socket.

Conexión, dirección = socket.accept()

Cuando se llama al método de aceptación, el socket entrará en el estado de "espera". Cuando el cliente solicita una conexión, el método establece la conexión y regresa al servidor. El método aceptar devuelve una tupla con dos elementos (conexión, dirección). El primer elemento, conexión, es el nuevo objeto socket a través del cual el servidor debe comunicarse con el cliente; el segundo elemento, dirección, es la dirección de Internet del cliente.

El quinto paso es la etapa de procesamiento. El servidor y el cliente se comunican (transmiten datos) a través de los métodos de envío y recepción. El servidor llama a enviar y envía información al cliente en forma de cadena.

El método de envío devuelve el número de caracteres enviados. El servidor recibe información del cliente mediante el método recv. Al llamar a recv, el servidor debe especificar un número entero que corresponda a la cantidad máxima de datos que se pueden recibir con esta llamada al método. El método recv entrará en el estado "bloqueado" al recibir datos y finalmente devolverá una cadena para representar los datos recibidos. Si la cantidad de datos enviados excede lo que permite recv, los datos se truncarán. El exceso de datos se almacenará en el extremo receptor. En llamadas posteriores a recv, el exceso de datos se elimina del búfer (junto con cualquier otro dato que el cliente haya enviado desde la última llamada a recv).

Cuando se completa la transmisión, el servidor llama al método de cierre del socket para cerrar la conexión.

Pasos para escribir cliente en Python:

Cree un socket para conectarse al servidor: socket = socket.socket(familia, tipo)

Conéctese usando el método de conexión del servidor de socket. Para la familia AF_INET, el formato de conexión es el siguiente:

socket.connect( (host, puerto) )

Host representa el nombre de host del servidor o IP y puerto representa el puerto número vinculado al proceso del servidor. Si la conexión es exitosa, el cliente puede comunicarse con el servidor a través del socket. Si la conexión falla, se generará una excepción socket.error.

En la fase de procesamiento, el cliente y el servidor se comunicarán a través del método de envío y el método de recepción.

Cuando se completa la transmisión, el cliente cierra la conexión llamando al método close del socket.

Aquí tienes un ejemplo sencillo:

server.py

código python

if __name__ == '__main__':

p>

importar socket

sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

sock.bind(('localhost', 8001) )

sock.listen(5)

mientras es verdadero:

conexión, dirección = sock.accept()

prueba:

conexión.settimeout(5)

buf = conexión.recv(1024)

if buf == '1':

conexión .send('¡bienvenido al servidor!')

else:

connection.send('¡salga por favor!')

excepto socket.timeout:

imprimir 'tiempo de espera'

conexión.close()

client.py

código Python

if __name__ == ' __main__':

importar socket

sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

sock.connect((' localhost', 8001 ))

hora de importación

time.sleep(2)

sock.send('1')

print sock.recv (1024)

sock.close()

Ejecute server.py en la terminal y luego ejecute clien.py, se imprimirá "¡bienvenido al servidor!" en la terminal. Si cambia sock.send('1') en client.py a otro valor, se imprimirá "¡salga!" en el terminal. Si cambia time.sleep(2) a un valor mayor que 5, el servidor. expirará el tiempo.

Ejemplo:

Lado del servidor:

#lado del servidor de socket

#Obtener estructura y constantes del socket

desde socket import *

#'' significa que el servidor es localhost

myHost = ''

#Escuche en un número de puerto no reservado

myPort = 50007

#Establecer un objeto de socket TCP

sockobj = socket(AF_INET, SOCK_STREAM)

#Vincularlo al número de puerto

p>

sockobj.bind((myHost, myPort))

#Escucha, permite 5 conexiones

sockobj.listen(5)

# El bucle no terminará hasta el final del proceso

mientras es Verdadero:

#Espera la próxima conexión del cliente

conexión, dirección = sockobj.accept()

#La conexión es un nuevo socket

imprime 'Servidor conectado por', dirección

mientras que es Verdadero:

#Leer el socket del cliente La siguiente línea de palabras

data = conexión.recv(1024)

#Si no hay cantidad, sal del bucle

si no son datos: romper

#Enviar una respuesta al cliente

conexión.send('Echo=gt;' datos)

#eof cuando el socket está cerrado

conexión.close()

Cliente:

importar sistema

desde importación de socket *

serverHost = 'localhost'

serverPort = 50007

#Texto predeterminado enviado al servidor

mensaje = ['Hola mundo de la red']

#Si el parámetro es mayor que 1, el servidor conectado es el primer parámetro

if len(sys.argv) gt;

serverHost = sys. argv[1]

#Si el parámetro es mayor que 2, el texto del enlace es el segundo parámetro

if len(sys.argv) gt:

mensaje = sys.argv[2:]

#Crear un objeto socket tcp/ip

sockobj = socket(AF_INET, SOCK_STREAM)

#Conectarse al servidor y al puerto

sockobj.connect((serverHost, serverPort))

para línea en el mensaje:

#Enviar línea al servidor a través el socket

sockobj.send (línea)

#El límite superior de datos recibidos del servidor es 1k

data = sockobj.recv(1024)

#Confirma que está citado, es 'x'

print 'Cliente recibido:', repr(data)

#Cerrar el socket

sockobj.close()