Avanzada Python (x): programación de la red

1. Introducción

la programación de la red es el trabajo principal en la información de extremo de envío es montado por un paquetes de protocolo especificadas, en el extremo receptor de acuerdo con un paquete de protocolo y analiza la información extraída correspondiente a última instancia lograr el propósito de la comunicación. Los protocolos de transporte son TCP y UDP, se requiere conexión TCP, un protocolo basado en flujo de bytes confiable se suele utilizar en conjunción con el protocolo IP, el UDP no requiere establecer una conexión, la escasa fiabilidad, pero más rápido.

Red programado con una toma importante concepto (socket), a través del cual una aplicación puede enviar o recibir datos, la aplicación permitirá a la toma I / O en la red, y comunicarse con otras aplicaciones en la red.

módulo Python socket proporciona los dos siguientes:

  • Socket
    proporciona una API estándar BSD sockets, el acceso al sistema operativo subyacente Todos los métodos interfaz Socket.

  • SocketServer
    ofrece centro de clase servidor, se puede simplificar el desarrollo de un servidor de red.

2. uso

2.1 Introducción API

Python es un objeto para crear una toma por una función socket (), el formato siguiente:

socket.socket (familia = AF_INET, tipo = SOCK_STREAM, proto = 0, fileno = None)

  • familia: Socket aromático, se puede utilizar AF_UNIX (sólo para el sistema de comunicación entre procesos, un solo Unix), AF_INET (la comunicación de red entre un servidor)

  • Tipo: el tipo socket, se puede utilizar SOCK_STREAM (orientado a conexión), SOCK_DGRAM (no conectado)

método de objeto socket de servidor:

método descripción
bind (dirección) El zócalo está obligado a dirección indica la dirección de tupla (host, puerto) en forma de AF_INET
escuchar ([retraso]) Comience a escuchar las conexiones TCP entrantes, retraso especificado antes de rechazar la conexión, el sistema operativo puede suspender el número máximo de conexiones, al menos 1, la mayoría de las aplicaciones será capaz de 5
aceptar() Y volvió a aceptar la conexión TCP (conn, dirección), objeto de socket conn es nueva, se puede utilizar para recibir y enviar datos, la dirección es la dirección del cliente está conectado

El método de cliente socket objeto:

método descripción
connect (dirección) Conectado a la dirección en la toma de corriente, el formato general para la tupla (nombre de host, puerto), si el error de conexión, un retorno de error socket.error
connect_ex (dirección) Función de conexión (dirección) de la misma, pero el éxito devuelve 0, en caso contrario devuelve el valor de errno

métodos públicos objeto de socket:

método descripción
recv (BUFSIZE [, banderas]) los datos del socket TCP, los datos se devuelven como una cadena, especifica la cantidad máxima de datos para ser recibida bufsize, bandera proporciona información adicional acerca del mensaje de aceptación, por lo general puede ser ignorada
send (bytes [, banderas]) transmisión de datos TCP, la cadena de datos de transmisión está conectado a la toma de corriente, el valor de retorno es el número de bytes a transmitir, el número puede ser más pequeño que el tamaño en bytes de la cadena
Sendall (bytes [, banderas]) Datos completos de envío TCP, envía la cadena de datos está conectado a la toma, pero antes de volver a tratar de enviar todos los datos, exitoso retorno Ninguno, se lanza una excepción fracaso
recvfrom (BUFSIZE [, banderas]) UDP manguito de alojamiento de datos, similar a la recv (), pero devuelve el valor (datos, dirección), donde los datos son recibidos comprenden datos de cadena de caracteres, la dirección de enchufe es la dirección de los datos de transmisión
sendto (bytes, banderas, dirección) transmisión de datos UDP, transmite los datos a la toma de corriente, la forma de la dirección (ipaddr, puerto) tupla especifica dirección remota, el valor de retorno es el número de bytes enviados
cerca() Cierra el socket
getpeername () Volver a la dirección remota de la caja de conexión, típicamente un tipo tupla (ipaddr, puerto)
getsockname () Las devoluciones propia dirección de la toma, por lo general una tupla (ipaddr, puerto)
setsockopt (nivel, optname, valor) Establecer el valor de una opción de conector dada
getsockopt (nivel, optname [, buflen]) El valor de retorno de la opción de socket
setTimeout (valor) juego de tubos operación de espera en segundos
gettimeout () Devuelve el tiempo de espera actual
fileno () Devuelve el descriptor de archivo de socket
setblocking (bandera) Si la bandera es 0, el conector está configurado en el modo de no bloqueo, de lo contrario el zócalo para el modo (el valor predeterminado) el bloqueo; modo de no bloqueo, si se llama a recv () no se encontraron datos o send () las llamadas no pueden estar inmediatamente enviar datos, hará que socket.error anormal
makefile () Crear un archivo asociado incluso con el zócalo

2.2 modo TCP

Nos fijamos en la forma de comunicarse a través de socket TCP.

Servidor ideas básicas:

  • Crear un socket, se unen a la toma de IP y el puerto

  • Escuchando conexiones

  • Continuar para aceptar la solicitud de conexión de un cliente

  • Recibir los datos solicitados, y transmite los datos de respuesta de la otra

  • Una vez completada la transmisión, se cierra el socket

código específico para lograr lo siguiente:

import socket

# 创建套接字
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 绑定地址
s.bind(('127.0.0.1', 6666))
# 监听连接
s.listen(5)
while True:
    print('等待客户端发送信息...')
    # 接收连接
    sock, addr = s.accept()
    # 接收请求数据
    data = sock.recv(1024).decode('utf-8')
    print('服务端接收请求数据:' + data)
    # 发送响应数据
    sock.sendall(data.upper().encode('utf-8'))
    # 关闭
    sock.close()

Cliente ideas básicas:

  • Crear zócalo, conecte el servidor

  • Después de conectar la transmisión, los datos recibidos

  • Una vez completada la transmisión, se cierra el socket

código específico para lograr lo siguiente:

import socket

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 连接服务端
s.connect(('127.0.0.1', 6666))
# 向服务端发送数据
s.sendall(b'hello')
# 接受服务端响应数据
data = s.recv(1024)
print('客户端接收响应数据:' + data.decode('utf-8'))
# 关闭
s.close()

Sólo tenemos que ejecutar el código del lado del servidor, el código se puede ejecutar el cliente.

2.3 modo UDP

Veamos cómo comunicarse de una manera a través de socket UDP.

Servidor ideas básicas:

  • Crear un socket, se unen a la toma de IP y el puerto

  • solicitud de datos de cliente que recibe

  • La transmisión de datos de respuesta al terminal cliente

código específico para lograr lo siguiente:

import socket

# 创建套接字
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 绑定地址
s.bind(('127.0.0.1', 6666))
while True:
    # 接收数据
    data, addr = s.recvfrom(1024)
    print('服务端接收请求数据:' + data.decode('utf-8'))
    # 响应数据
    s.sendto(data.decode('utf-8').upper().encode('utf-8'), addr)

Cliente ideas básicas:

  • crear zócalo

  • Enviar datos al servidor

  • Recibir datos de respuesta del servidor

código específico para lograr lo siguiente:

import socket

# 创建套接字
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 向服务端发送数据
s.sendto(b'hello', ('127.0.0.1', 6666))
# 接受服务端响应数据
data = s.recv(1024).decode('utf-8')
print('客户端接收响应数据:' + data)
# 关闭
s.close()

Del mismo modo, corremos el código del lado del servidor y ejecute el código del cliente.


Publicado 64 artículos originales · ganado elogios 1276 · Vistas de 300.000 +

Supongo que te gusta

Origin blog.csdn.net/ityard/article/details/104661342
Recomendado
Clasificación