Python - Programación de sockets
Python proporciona dos niveles de acceso a los servicios de red. En un nivel bajo, puede acceder al soporte básico de socket en el sistema operativo subyacente, lo que le permite implementar clientes y servidores para protocolos orientados a conexión y sin conexión.
Python también tiene bibliotecas que brindan acceso de nivel superior a protocolos de red de nivel de aplicación específicos, como FTP, HTTP, etc.
Los sockets son los puntos finales de un canal de comunicaciones bidireccional. Los sockets pueden comunicarse dentro de un proceso, entre procesos en la misma máquina o entre procesos en diferentes continentes. Usamos el módulo socket en Python para crear y usar sockets.
Los sockets tienen su propio vocabulario:
No Señor. | Término y descripción |
---|---|
1 | Domain La familia de protocolos que se utiliza como mecanismo de transporte. Estos valores son constantes como AF_INET, PF_INET, PF_UNIX, PF_X25, etc. |
2 | type El tipo de comunicaciones entre los dos puntos finales, normalmente SOCK_STREAM para protocolos orientados a conexión y SOCK_DGRAM para protocolos sin conexión. |
3 | protocol Normalmente cero, esto se puede usar para identificar una variante de un protocolo dentro de un dominio y tipo. |
4 | hostname El identificador de una interfaz de red -
|
5 | port Cada servidor escucha a los clientes que llaman a uno o más puertos. Un puerto puede ser un número de puerto de Fixnum, una cadena que contiene un número de puerto o el nombre de un servicio. |
El módulo de enchufe
Para crear un socket, debe usar la función socket.socket () disponible en el módulo socket , que tiene la sintaxis general -
s = socket.socket (socket_family, socket_type, protocol=0)
Aquí está la descripción de los parámetros:
socket_family - Esto es AF_UNIX o AF_INET, como se explicó anteriormente.
socket_type - Esto es SOCK_STREAM o SOCK_DGRAM.
protocol - Por lo general, se omite, y el valor predeterminado es 0.
Una vez que tenga el objeto socket , puede usar las funciones requeridas para crear su programa cliente o servidor.
Métodos de socket del servidor
No Señor. | Método y descripción |
---|---|
1 | s.bind() Este método vincula la dirección (nombre de host, par de número de puerto) al socket. |
2 | s.listen() Este método configura e inicia el escucha de TCP. |
3 | s.accept() Esto acepta pasivamente la conexión del cliente TCP, esperando hasta que llegue la conexión (bloqueo). |
Métodos de socket de cliente
No Señor. | Método y descripción |
---|---|
1 | s.connect() Este método inicia activamente la conexión al servidor TCP. |
Métodos generales de socket
No Señor. | Método y descripción |
---|---|
1 | s.recv() Este método recibe un mensaje TCP |
2 | s.send() Este método transmite un mensaje TCP |
3 | s.recvfrom() Este método recibe un mensaje UDP |
4 | s.sendto() Este método transmite mensajes UDP |
5 | s.close() Este método cierra el socket |
6 | socket.gethostname() Devuelve el nombre de host. |
Un servidor simple
Para escribir servidores de Internet, usamos el socketfunción disponible en el módulo socket para crear un objeto socket. A continuación, se utiliza un objeto de socket para llamar a otras funciones para configurar un servidor de socket.
Ahora llama bind(hostname, port)función para especificar un puerto para su servicio en el host dado.
A continuación, llame al método accept del objeto devuelto. Este método espera hasta que un cliente se conecta al puerto que especificó y luego devuelve un objeto de conexión que representa la conexión a ese cliente.
#!/usr/bin/python # This is server.py file
import socket # Import socket module
s = socket.socket() # Create a socket object
host = socket.gethostname() # Get local machine name
port = 12345 # Reserve a port for your service.
s.bind((host, port)) # Bind to the port
s.listen(5) # Now wait for client connection.
while True:
c, addr = s.accept() # Establish connection with client.
print 'Got connection from', addr
c.send('Thank you for connecting')
c.close() # Close the connection
Un cliente simple
Escribamos un programa cliente muy simple que abre una conexión a un puerto determinado 12345 y un host determinado. Esto es muy simple para crear un cliente de socket usando la función del módulo de socket de Python .
los socket.connect(hosname, port )abre una conexión TCP al nombre de host en el puerto . Una vez que tenga un socket abierto, puede leerlo como cualquier objeto IO. Cuando termine, recuerde cerrarlo, como cerraría un archivo.
El siguiente código es un cliente muy simple que se conecta a un host y puerto determinados, lee cualquier dato disponible del socket y luego sale:
#!/usr/bin/python # This is client.py file
import socket # Import socket module
s = socket.socket() # Create a socket object
host = socket.gethostname() # Get local machine name
port = 12345 # Reserve a port for your service.
s.connect((host, port))
print s.recv(1024)
s.close # Close the socket when done
Ahora ejecute este server.py en segundo plano y luego ejecute por encima de client.py para ver el resultado.
# Following would start a server in background.
$ python server.py & # Once server is started run client as follows: $ python client.py
Esto produciría el siguiente resultado:
Got connection from ('127.0.0.1', 48437)
Thank you for connecting
Socket con URL pública
En el siguiente ejemplo, usamos algunos métodos del módulo de socket para encontrar la información de la dirección del servidor y los detalles del nombre de host.
import socket
from pprint import pprint
# get server address
addrinfo = socket.getaddrinfo('tutorialspoint.com', 'www')
pprint(addrinfo)
# get server hostname
print socket.gethostname()
Cuando ejecutamos el programa anterior, obtenemos el siguiente resultado:
[(2, 1, 0, '', ('94.130.81.180', 80))]
DESKTOP-JXYKQCPLP