¿Python tiene buen soporte para la programación de socket?

¡Hola!

Python ciertamente tiene un soporte suficiente para la programación de sockets. La biblioteca estándar de Python tiene un módulo llamado socket que proporciona una interfaz de red de Internet de bajo nivel. Esta interfaz es común en diferentes lenguajes de programación, ya que utiliza llamadas del sistema a nivel del sistema operativo.

Para crear un socket, hay una función llamada socket . Acepta argumentos de family , type y proto (consulte la documentación para más detalles). Para crear un socket TCP, debe usar socket.AF_INET o socket.AF_INET6 para la family y socket.SOCK_STREAM para el type :

  importar sockets = socket.socket (socket.AF_INET, socket.SOCK_STREAM)

Devuelve un objeto de socket que tiene los siguientes métodos principales:

  • bind()
  • listen()
  • accept()
  • connect()
  • send()
  • recv()

bind() , listen() y accept() son específicos para los sockets del servidor. connect() es específico para sockets de clientes. send() y recv() son comunes para ambos tipos. Aquí hay un ejemplo de servidor Echo de la documentación:

  importar sockets = socket.socket (socket.AF_INET, socket.SOCK_STREAM) s.bind (('localhost', 50000)) s.listen (1) conn, addr = s.accept () mientras 1: data = conn.recv (1024) si no son datos: break conn.sendall (data) conn.close ()

Aquí creamos un socket de servidor, lo vinculamos a un puerto local y al puerto 50000, y comenzamos a escuchar las conexiones entrantes. Para aceptar una conexión entrante, llamamos al método accept() que se bloqueará hasta que se conecte un nuevo cliente. Cuando esto sucede, crea un nuevo socket y lo devuelve junto con la dirección del cliente. Luego, en un ciclo infinito, lee los datos del socket en lotes de 1024 bytes usando el método recv() hasta que devuelve una cadena vacía. Después de eso, envía todos los datos entrantes utilizando un método conveniente sendall() que en su interior llama repetidamente a recv() . Y después de eso, simplemente cierra la conexión del cliente. Este ejemplo puede servir solo una conexión entrante porque no llama a accept() en un ciclo.

Puede leer el resto de ‘Trabajar con sockets TCP en Python 2.X’ visitando nuestro blog en Trabajar con sockets TCP en Python 2.x con select

Seguro. He trabajado mucho con Java para la programación de Socket, pero para mi proyecto actual que requería una aplicación desenfrenada de la programación de Socket (servidor TCP / UDP / módulos de cliente con soporte para transmisión de medios, conexiones SSL, etc.) elegí ir con Python.

¿Desea iniciar un servidor TCP multiproceso en Python? Aquí,

 

 subprocesos de importación, SocketServer

 clase ThreadedTCPServer (SocketServer.ThreadingMixIn, SocketServer.TCPServer):
   pasar

 '' '
   Manejador de solicitudes (Nuevo hilo para cada sesión)
 '' '
 clase ThreadedTCPRequestHandler (SocketServer.BaseRequestHandler):

   def __init __ (self):
     pasar

   mango de def (auto):
     # Lógica para conexiones entrantes aquí
     pasar

 HOST, PORT = "localhost", 9999

 servidor = ThreadedTCPServer ((HOST, PORT), ThreadedTCPRequestHandler)
 ip, port = server.server_address

 # Inicie un hilo con el servidor: ese hilo comenzará uno
 # más hilos para cada solicitud
 server_thread = threading.Thread (target = server.serve_forever)
 # Salga del hilo del servidor cuando el hilo principal termina
 server_thread.daemon = True
 server_thread.start () 

¿Desea establecer una conexión del lado del cliente a un servidor TCP? Aquí,

 
 zócalo de importación

 ip, port = 'localhost', 9999

 calcetín = socket.socket (socket.AF_INET, socket.SOCK_STREAM)
 sock.connect ((ip, puerto))
 mientras cierto:
   data = sock.recv (1024)
   si no datos:
     descanso
   imprimir datos 

¡Combine esto con la biblioteca Python de procesamiento múltiple que utiliza la comunicación a través de tuberías y tiene un elegante fragmento mínimo de código Python que maneja todo con bastante gracia!

Echa un vistazo a la estructura de tornado, la estructura retorcida y la estructura de halcón. Si se ajustan perfectamente a lo que está intentando, entonces sí, puede elegir python.