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.