SocketsBasicoPython#

Definición del socket servidor#

La función socket.socket() se utiliza para crear el objeto socket, y toma dos argumentos: el dominio de dirección y el tipo de socket.

  • socket.AF_INET: Especifica el dominio de dirección del socket. AF_INET indica que se utilizará el protocolo de direcciones IPv4. Si quisieras utilizar el protocolo de direcciones IPv6, usarías AF_INET6.

  • socket.SOCK_STREAM: Especifica el tipo de socket. SOCK_STREAM indica que se utilizará un socket orientado a la conexión, que en este caso es TCP. Si quisieras crear un socket UDP, usarías SOCK_DGRAM.

import socket

def main():
    server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # Este es el objeto que define el socket de tipo TCP
    server_socket.bind(('localhost', 12345)) # El método bind() del objeto socket toma como argumento una tupla que contiene 
                                             # la dirección IP y el número de puerto a los que se debe enlazar el socket
    
    server_socket.listen(1) # El método listen() es esencial en un servidor TCP, ya que configura el socket para que acepte 
                            # conexiones entrantes. El número 1 es para que solo acepte una conexión al tiempo.
        
    print("Servidor escuchando en el puerto 12345...")

    client_socket, client_address = server_socket.accept() # El método accept() bloquea la ejecución del programa hasta que 
                                                           # se establezca una conexión entrante, y luego devuelve un nuevo 
                                                           # objeto socket que representa la conexión con el cliente. Este método
                                                           # aquí está retornando la dirección IP de la conexión y el socket cliente
    
    
    print(f"Conexión entrante desde {client_address}")

    message = client_socket.recv(1024).decode('utf-8') # recibe hasta 1024 bytes de datos del socket, y luego decodifica estos 
                                                       # datos como una cadena de caracteres utilizando la codificación 'utf-8'.
    print(f"Mensaje recibido del cliente: {message}")

    client_socket.send("Mensaje recibido por el servidor.".encode('utf-8')) # Envía hasta 1024 bytes de datos del socket, 
                                                                            # pero los codifica en 'utf-8'
    client_socket.close() # Se cierra el socket cliente
    server_socket.close() # Se cierra el socket servidor

if __name__ == "__main__":
    main()

Definición del socket cliente#

import socket

def main():
    client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    client_socket.connect(('localhost', 12345)) # Método para conectarse al socket en la IP:puerto especificado.

    client_socket.send("Hola, servidor!".encode('utf-8'))
    response = client_socket.recv(1024).decode('utf-8')

    print(f"Respuesta del servidor: {response}")

    client_socket.close()

if __name__ == "__main__":
    main()