El zócalo y sus métodos

Los sockets son los puntos finales de un canal de comunicación bidireccional. Pueden comunicarse dentro de un proceso, entre procesos en la misma máquina o entre procesos en diferentes máquinas. En una nota similar, un conector de red es un punto final en un flujo de comunicación entre dos programas que se ejecutan en una red informática como Internet. Es una cosa puramente virtual y no significa ningún hardware. El socket de red puede identificarse mediante una combinación única de una dirección IP y un número de puerto. Los sockets de red se pueden implementar en varios tipos de canales diferentes, como TCP, UDP, etc.

Los diferentes términos relacionados con el zócalo utilizados en la programación de la red son los siguientes:

Dominio

El dominio es 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.

Tipo

Tipo significa el tipo de comunicación entre dos puntos finales, normalmente SOCK_STREAM para protocolos orientados a conexión y SOCK_DGRAM para protocolos sin conexión.

Protocolo

Esto se puede usar para identificar una variante de un protocolo dentro de un dominio y tipo. Su valor predeterminado es 0. Por lo general, se omite.

Nombre de host

Esto funciona como el identificador de una interfaz de red. Un nombre de host no puede ser una cadena, una dirección de cuatro puntos o una dirección IPV6 en notación de dos puntos (y posiblemente un punto).

Puerto

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 contenga un número de puerto o el nombre de un servicio.

Módulo de socket de Python para la programación de socket

Para implementar la programación de socket en Python, necesitamos usar el módulo Socket. A continuación se muestra una sintaxis simple para crear un Socket:

import socket
s = socket.socket (socket_family, socket_type, protocol = 0)

Aquí, necesitamos importar la biblioteca de sockets y luego hacer un socket simple. A continuación se muestran los diferentes parámetros utilizados al hacer socket:

  • 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.

Métodos de socket

En esta sección, aprenderemos sobre los diferentes métodos de socket. Los tres conjuntos diferentes de métodos de socket se describen a continuación:

  • Métodos de socket del servidor
  • Métodos de socket de cliente
  • Métodos generales de socket

Métodos de socket del servidor

En la arquitectura cliente-servidor, hay un servidor centralizado que brinda servicio y muchos clientes reciben servicio de ese servidor centralizado. Los clientes también realizan la solicitud al servidor. Algunos métodos importantes de socket de servidor en esta arquitectura son los siguientes:

  • socket.bind() - Este método vincula la dirección (nombre de host, número de puerto) al socket.

  • socket.listen()- Este método básicamente escucha las conexiones realizadas al socket. Inicia el oyente TCP. Backlog es un argumento de este método que especifica el número máximo de conexiones en cola. Su valor mínimo es 0 y el valor máximo es 5.

  • socket.accept()- Esto aceptará la conexión del cliente TCP. El par (conexión, dirección) es el par de valor de retorno de este método. Aquí, conn es un nuevo objeto de socket que se utiliza para enviar y recibir datos sobre la conexión y la dirección es la dirección vinculada al socket. Antes de usar este método, se deben usar los métodos socket.bind () y socket.listen ().

Métodos de socket de cliente

El cliente en la arquitectura cliente-servidor solicita el servidor y recibe servicios del servidor. Para esto, solo hay un método dedicado para los clientes:

  • socket.connect(address)- este método conecta activamente al servidor íntimo o, en palabras simples, este método conecta al cliente con el servidor. La dirección del argumento representa la dirección del servidor.

Métodos generales de socket

Aparte de los métodos de socket de cliente y servidor, existen algunos métodos de socket generales, que son muy útiles en la programación de sockets. Los métodos generales de conexión son los siguientes:

  • socket.recv(bufsize)- Como su nombre lo indica, este método recibe el mensaje TCP del socket. El argumento bufsize representa el tamaño del búfer y define los datos máximos que este método puede recibir en cualquier momento.

  • socket.send(bytes)- Este método se utiliza para enviar datos al enchufe que está conectado a la máquina remota. El argumento bytes dará el número de bytes enviados al socket.

  • socket.recvfrom(data, address)- Este método recibe datos del socket. Este método devuelve un valor de dos pares (datos, dirección). Los datos definen los datos recibidos y la dirección especifica la dirección del socket que envía los datos.

  • socket.sendto(data, address)- Como su nombre lo indica, este método se utiliza para enviar datos desde el socket. Este método devuelve un valor de dos pares (datos, dirección). Los datos definen el número de bytes enviados y la dirección especifica la dirección de la máquina remota.

  • socket.close() - Este método cerrará el enchufe.

  • socket.gethostname() - Este método devolverá el nombre del anfitrión.

  • socket.sendall(data)- Este método envía todos los datos al socket que está conectado a una máquina remota. Transfiere los datos sin cuidado hasta que se produce un error y, si ocurre, utiliza el método socket.close () para cerrar el socket.

Programa para establecer una conexión entre servidor y cliente

Para establecer una conexión entre el servidor y el cliente, necesitamos escribir dos programas Python diferentes, uno para el servidor y otro para el cliente.

Programa del lado del servidor

En este programa de socket del lado del servidor, usaremos el socket.bind()método que lo vincula a una dirección IP y puerto específicos para que pueda escuchar las solicitudes entrantes en esa IP y puerto. Más tarde, usamos elsocket.listen()método que pone al servidor en modo de escucha. El número, digamos 4, como argumento delsocket.listen()El método significa que 4 conexiones se mantienen esperando si el servidor está ocupado y si un quinto enchufe intenta conectarse, la conexión se rechaza. Enviaremos un mensaje al cliente utilizando elsocket.send()método. Hacia el final, usamos elsocket.accept() y socket.close()método para iniciar y cerrar la conexión respectivamente. A continuación se muestra un programa del lado del servidor:

import socket
def Main():
   host = socket.gethostname()
   port = 12345
   serversocket = socket.socket()
   serversocket.bind((host,port))
   serversocket.listen(1)
   print('socket is listening')
   
   while True:
      conn,addr = serversocket.accept()
      print("Got connection from %s" % str(addr))
      msg = 'Connecting Established'+ "\r\n"
      conn.send(msg.encode('ascii'))
      conn.close()
if __name__ == '__main__':
   Main()

Programa del lado del cliente

En el programa de socket del lado del cliente, necesitamos crear un objeto de socket. Luego nos conectaremos al puerto en el que se ejecuta nuestro servidor, 12345 en nuestro ejemplo. Después de eso, estableceremos una conexión usando elsocket.connect()método. Luego, usando elsocket.recv()método, el cliente recibirá el mensaje del servidor. Por fin, elsocket.close() El método cerrará el cliente.

import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

host = socket.gethostname()
port = 12345

s.connect((host, port))
msg = s.recv(1024)

s.close()
print (msg.decode('ascii'))

Ahora, después de ejecutar el programa del lado del servidor, obtendremos el siguiente resultado en la terminal:

socket is listening
Got connection from ('192.168.43.75', 49904)

Y después de ejecutar el programa del lado del cliente, obtendremos el siguiente resultado en otra terminal:

Connection Established

Manejo de excepciones de sockets de red

Hay dos bloques a saber try y exceptque se puede utilizar para manejar excepciones de sockets de red. A continuación se muestra una secuencia de comandos de Python para manejar la excepción:

import socket
host = "192.168.43.75"
port = 12345
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

try:
   s.bind((host,port))
   s.settimeout(3)
   data, addr = s.recvfrom(1024)
   print ("recevied from ",addr)
   print ("obtained ", data)
   s.close()
except socket.timeout :
   print ("No connection between client and server")
   s.close()

Salida

El programa anterior genera la siguiente salida:

No connection between client and server

En el script anterior, primero creamos un objeto socket. A continuación, se proporcionó la dirección IP del host y el número de puerto en el que se ejecuta nuestro servidor, 12345 en nuestro ejemplo. Posteriormente, se usa el bloque try y dentro de él usando elsocket.bind()método, intentaremos vincular la dirección IP y el puerto. Estamos usandosocket.settimeout()método para configurar el tiempo de espera para el cliente, en nuestro ejemplo estamos configurando 3 segundos. Se utiliza el bloque excepto que imprimirá un mensaje si no se establece la conexión entre el servidor y el cliente.