La diferencia entre python socketserver y socket
Diferencias:
1. Primero introduzca socket
El significado original de socket en inglés es "agujero" o "socket". Como mecanismo de comunicación de procesos de BSD UNIX, se toma el último significado. También comúnmente llamado "socket", se usa para describir una dirección IP y un puerto. Es un identificador de una cadena de comunicación y se puede usar para implementar la comunicación entre diferentes máquinas virtuales o diferentes computadoras. Los servidores de Internet generalmente ejecutan software de múltiples servicios y brindan varios servicios al mismo tiempo. Cada servicio abre un socket y está vinculado a un puerto. Diferentes puertos corresponden a diferentes servicios. Socket es tal como su significado original en inglés, como un zócalo de múltiples orificios. Un anfitrión es como una habitación llena de varios enchufes. Cada enchufe tiene un número. Algunos enchufes proporcionan alimentación de CA de 220 voltios, otros proporcionan alimentación de CA de 110 voltios y otros proporcionan programas de televisión por cable. El software del cliente conecta el enchufe en el enchufe con diferentes números para obtener diferentes servicios
2 Principio de conexión
Según la forma en que se inicia la conexión y el destino al que está conectado el enchufe local. está conectado, El proceso de conexión entre sockets se puede dividir en tres pasos: escucha del servidor, solicitud del cliente y confirmación de la conexión.
(1) Monitoreo del servidor: el socket del lado del servidor no localiza el socket del cliente específico, pero está en un estado de espera de conexión y monitorea el estado de la red en tiempo real.
(2) Solicitud del cliente: se refiere a una solicitud de conexión realizada por el socket del cliente, y el objetivo a conectar es el socket del servidor. Para hacer esto, el socket del cliente primero debe describir el socket del servidor al que desea conectarse, indicar la dirección y el número de puerto del socket del lado del servidor y luego realizar una solicitud de conexión al socket del lado del servidor.
(3) Confirmación de conexión: significa que cuando el socket del lado del servidor escucha o recibe la solicitud de conexión del socket del cliente, responde a la solicitud del socket del cliente y establece una nueva solicitud de conexión. envía la descripción del socket del lado del servidor al cliente. Una vez que el cliente confirma esta descripción, se establece la conexión. El socket del lado del servidor continúa en estado de escucha y continúa recibiendo solicitudes de conexión de otros sockets del cliente.
Caso
1. El servidor web más simple
2. Herramienta de chat simple
(1) lado del servicio
(2) cliente
3. Más funciones
Más funciones
sk =?socket.socket(socket.AF_INET,socket .SOCK_STREAM,0)
Parámetro 1: Clúster de direcciones
socket.AF_INET IPv4 (predeterminado)
socket.AF_INET6 IPv6
socket.AF_UNIX solo puede ser utilizado para la comunicación entre procesos en un único sistema Unix
Parámetro 2: Tipo
socket.SOCK_STREAM Socket de transmisión, para?TCP (predeterminado)
socket. SOCK_DGRAM Socket de datagrama, para?UDP
socket.SOCK_RAW socket sin formato, los sockets normales no pueden manejar mensajes de red como ICMP e IGMP, y
SOCK_RAW en segundo lugar, SOCK_RAW también puede manejar mensajes especiales; mensajes IPv4; además, utilizando sockets sin formato, el usuario puede construir el encabezado IP a través de la opción de socket IP_HDRINCL.
socket.SOCK_RDM es una forma confiable de UDP, que garantiza la entrega de datagramas pero no garantiza el pedido.
SOCK_RAM se utiliza para proporcionar acceso de bajo nivel al protocolo original y se utiliza cuando es necesario realizar ciertas operaciones especiales,
como enviar mensajes ICMP. SOCK_RAM suele estar restringido a programas ejecutados por usuarios avanzados o administradores.
socket.SOCK_SEQPACKET Servicio de paquetes continuo confiable
Parámetro tres: Protocolo
0 (predeterminado) El protocolo relacionado con la familia de direcciones específica, si es 0?,
El sistema seleccionará automáticamente un protocolo adecuado según el formato de la dirección y el tipo de socket
sk.bind(address)
s. socket a una dirección. El formato de la dirección depende de la familia de direcciones.
En AF_INET, la dirección se expresa en forma de tupla (host, puerto).
sk.listen(backlog)
Empiece a escuchar las conexiones entrantes. El trabajo pendiente especifica el número máximo de conexiones que pueden estar pendientes antes de que se rechace la conexión.
El backlog es igual a 5, lo que significa que el kernel ha recibido la solicitud de conexión, pero el servidor no ha llamado a aceptar para su procesamiento.
El número máximo de conexiones es 5. Este valor no puede. ser infinito porque requiere Mantener la cola de conexión en el kernel
sk.setblocking(bool)
Si se debe bloquear (verdadero por defecto), si se establece en Falso, si no hay datos durante la aceptación y la recepción, se informará un error.
sk.accept()
Acepta la conexión y devuelve (conn, dirección), donde conn es un nuevo objeto de socket que se puede utilizar para recibir
y enviar datos. dirección es la dirección para conectarse con el cliente. Recibe conexiones de clientes TCP (bloqueo) y espera la llegada de la conexión
sk.connect(address)
Conectarse al socket en la dirección. Generalmente, el formato de la dirección es una tupla (nombre de host, puerto).
Si hay un error de conexión, se devolverá un error socket.error.
sk.connect_ex(address)
Igual que el anterior, excepto que habrá un valor de retorno. Cuando la conexión es exitosa, devuelve 0?, cuando la conexión falla, devuelve. el código, por ejemplo: 10061
sk.close()
Cerrar el socket
sk.recv(bufsize[,flag])
Acepte los datos del socket. Los datos se devuelven como una cadena y bufsize especifica el número máximo que se puede recibir.
La bandera proporciona información adicional sobre el mensaje y normalmente se puede ignorar.
sk.recvfrom(bufsize[.flag])
Similar a recv(), pero el valor de retorno es (datos, dirección). Donde datos es una cadena que contiene los datos recibidos y dirección es la dirección del socket para enviar datos.
sk.send(string[,flag])
Envía los datos en cadena al socket conectado. El valor de retorno es la cantidad de bytes a enviar, que puede ser menor que el tamaño de bytes de la cadena. Es decir: es posible que no se envíe todo el contenido especificado.
sk.sendall(string[,flag])
Envía los datos en cadena al socket conectado, pero intenta enviar todos los datos antes de regresar.
No se devuelve ninguno en caso de éxito y se genera una excepción en caso de error.
Internamente, se llama a enviar de forma recursiva para enviar todo el contenido.
sk.sendto(string[,flag],address)
Envía datos al socket, la dirección es una tupla del formato (ipaddr, puerto), especificando la dirección remota.
El valor de retorno es el número de bytes enviados. Esta función se utiliza principalmente para el protocolo UDP.
sk.settimeout(timeout)
Establece el período de tiempo de espera para las operaciones de socket. El tiempo de espera es un número de punto flotante en segundos. Un valor de Ninguno significa que no hay ningún período de tiempo de espera.
Generalmente, el período de tiempo de espera debe establecerse cuando se crea el socket por primera vez, ya que se puede usar para operaciones de conexión
(Por ejemplo, ¿la conexión del cliente puede esperar hasta 5 segundos? )
sk.getpeername()
Devuelve la dirección remota del socket de conexión. El valor de retorno suele ser una tupla (ipaddr, puerto).
sk.getsockname()
Devuelve la dirección propia del socket. Generalmente una tupla (ipaddr, puerto)
sk.fileno()
El descriptor de archivo del socket
2 servidor de socket
Nota: Al importar el módulo, la versión 3.x es socketserver y la versión 2.x es SocketServer
1.ThreadingTCPServer
El servidor Soket interno implementado por ThreadingTCPServer será Cada cliente crea un "hilo", que se utiliza para interactuar con el cliente.
Conceptos básicos de ThreadingTCPServer
Uso de ThreadingTCPServer:
Crear una clase que herede de SocketServer.BaseRequestHandler
Se debe definir una clase llamada handle Método
Iniciar ThreadingTCPServer
Servidor
Cliente
El proceso de llamada interna es:
Iniciar el servicio Finalizar programa
Ejecutar el método TCPServer.init?, crear el objeto Socket del servidor y vincular la IP y el puerto
Ejecutar el método BaseServer.init, heredar el personalizado de SocketServer.BaseRequestHandler La clase - MyRequestHandle es asignado a self.RequestHandlerClass
Ejecute el método BaseServer.server_forever y el bucle While sigue monitoreando si llega una solicitud del cliente...
Cuando la conexión del cliente llega al servidor
p>Ejecutar el método ThreadingMixIn.process_request y crear un "hilo" para procesar la solicitud
Ejecutar el método ThreadingMixIn.process_request_thread
Ejecutar el método BaseServer.finish_request y ejecutar self.RequestHandlerClass( ) Es decir: ejecutar el método de construcción del MyRequestHandler personalizado (llamar automáticamente al método de construcción de la clase base BaseRequestHandler, en la que se llamará el método de manejo de MyRequestHandler)
ForkingTCPServer
ForkingTCPServer y El proceso de uso y ejecución de ThreadingTCPServer son básicamente los mismos, excepto que los "hilos" y los "procesos" se establecen internamente para el solicitante.