Python Socket Mehrere Clients

So arbeite ich an einer iPhone-App, die einen Socket benötigt, um mehrere Clients für Online-Spiele zu behandeln. Ich habe verdreht versucht, und mit viel Mühe habe ich es versäumt, eine Menge von Informationen zu bekommen, um sofort geschickt zu werden, weshalb ich jetzt eine Steckdose versuche.

Meine Frage ist, mit dem Code unten, wie würden Sie in der Lage sein, mehrere Clients angeschlossen haben? Ich habe Listen versucht, aber ich kann einfach nicht herausfinden, das Format dafür. Wie kann dies erreicht werden, wo mehrere Clients gleichzeitig verbunden sind und ich bin in der Lage, eine Nachricht an einen bestimmten Client zu senden?

Vielen Dank!

#!/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 = 50000 # Reserve a port for your service. print 'Server started!' print 'Waiting for clients...' s.bind((host, port)) # Bind to the port s.listen(5) # Now wait for client connection. c, addr = s.accept() # Establish connection with client. print 'Got connection from', addr while True: msg = c.recv(1024) print addr, ' >> ', msg msg = raw_input('SERVER >> ') c.send(msg); #c.close() # Close the connection 

4 Solutions collect form web for “Python Socket Mehrere Clients”

accept können kontinuierlich neue Client-Verbindungen. Allerdings beachten Sie, dass es, und andere Socket-Anrufe sind in der Regel blockiert. Deshalb haben Sie an dieser Stelle noch ein paar Optionen:

  • Öffnen Sie neue Threads, um Clients zu behandeln, während der Hauptthread zurück zur Akzeptierung neuer Clients geht
  • Wie oben aber mit Prozessen, anstelle von Threads
  • Verwenden Sie asynchrone Sockel Frameworks wie Twisted, oder eine Fülle von anderen

Hier ist das Beispiel aus der SocketServer-Dokumentation, die einen hervorragenden Ausgangspunkt machen würde

 import SocketServer class MyTCPHandler(SocketServer.BaseRequestHandler): """ The RequestHandler class for our server. It is instantiated once per connection to the server, and must override the handle() method to implement communication to the client. """ def handle(self): # self.request is the TCP socket connected to the client self.data = self.request.recv(1024).strip() print "{} wrote:".format(self.client_address[0]) print self.data # just send back the same data, but upper-cased self.request.sendall(self.data.upper()) if __name__ == "__main__": HOST, PORT = "localhost", 9999 # Create the server, binding to localhost on port 9999 server = SocketServer.TCPServer((HOST, PORT), MyTCPHandler) # Activate the server; this will keep running until you # interrupt the program with Ctrl-C server.serve_forever() 

Versuchen Sie es von einem Terminal wie dieses

 $ telnet localhost 9999 Trying 127.0.0.1... Connected to localhost. Escape character is '^]'. Hello HELLOConnection closed by foreign host. $ telnet localhost 9999 Trying 127.0.0.1... Connected to localhost. Escape character is '^]'. Sausage SAUSAGEConnection closed by foreign host. 

Du musst wohl auch ein Forking oder Threading Mixin verwenden

Basierend auf Ihrer Frage !!!

Meine Frage ist, mit dem Code unten, wie würden Sie in der Lage sein, mehrere Clients angeschlossen haben? Ich habe Listen versucht, aber ich kann einfach nicht herausfinden, das Format dafür. Wie kann dies erreicht werden, wo mehrere Clients gleichzeitig verbunden sind und ich bin in der Lage, eine Nachricht an einen bestimmten Client zu senden?

Mit dem Code, den du gegeben hast, kannst du das machen.

  #!/usr/bin/python # This is server.py file import socket # Import socket module import thread def on_new_client(clientsocket,addr): while True: msg = clientsocket.recv(1024) #do some checks and if msg == someWeirdSignal: break: print addr, ' >> ', msg msg = raw_input('SERVER >> ') #Maybe some code to compute the last digit of PI, play game or anything else can go here and when you are done. clientsocket.send(msg) clientsocket.close() s = socket.socket() # Create a socket object host = socket.gethostname() # Get local machine name port = 50000 # Reserve a port for your service. print 'Server started!' print 'Waiting for clients...' s.bind((host, port)) # Bind to the port s.listen(5) # Now wait for client connection. print 'Got connection from', addr while True: c, addr = s.accept() # Establish connection with client. thread.start_new_thread(on_new_client,(c,addr)) #Note it's (addr,) not (addr) because second parameter is a tuple #Edit: (c,addr) #that's how you pass arguments to functions when creating new threads using thread module. s.close() 

Wie Eli Bendersky erwähnt, können Sie Prozesse anstelle von Threads verwenden, können Sie auch Python- threading Modul oder andere asynchrone Sockets Framework überprüfen. Hinweis: Checks sind für Sie zu implementieren, wie Sie wollen und das ist nur ein grundlegendes Framework.

Dieses Programm öffnet 26 Sockets, wo man in der Lage wäre, eine Menge TCP-Clients zu verbinden.

 #!usr/bin/python from thread import * import socket import sys def clientthread(conn): buffer="" while True: data = conn.recv(8192) buffer+=data print buffer #conn.sendall(reply) conn.close() def main(): try: host = '192.168.1.3' port = 6666 tot_socket = 26 list_sock = [] for i in range(tot_socket): s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1) s.bind((host, port+i)) s.listen(10) list_sock.append(s) print "[*] Server listening on %s %d" %(host, (port+i)) while 1: for j in range(len(list_sock)): conn, addr = list_sock[j].accept() print '[*] Connected with ' + addr[0] + ':' + str(addr[1]) start_new_thread(clientthread ,(conn,)) s.close() except KeyboardInterrupt as msg: sys.exit(0) if __name__ == "__main__": main() 
  • Erstellen eines Multithread-Servers mit SocketServer-Framework in Python
  • Python Multicast funktioniert nicht zwischen zwei verschiedenen Computern
  • Force setsockopt in python durch Ersetzen der Socket () Methode
  • EOF-Fehler mit recv in python
  • Datei in Steckdose Adapter in Python
  • TypeError: ein Bytes-ähnliches Objekt ist erforderlich, nicht 'str'
  • Asynchrone Steckdosen mit Auswahl - Python
  • Python: Größe der Nachricht per Socket zu senden
  • Wie kann man eine Python-Socket.accept () anrufen?
  • Socket-Fehler [Errno 9] Schlechter Dateideskriptor HTTP-Server
  • Android.bluetooth.BluetoothSocket kann nicht verbinden
  • Python ist die beste Programmiersprache der Welt.