Python-Client-Sockets, die auf demselben Server-Socket-Port verbinden

Ich arbeite zum ersten mal an sockets mit python Ich muss mehr als eine Client-Socket an die gleiche Server-Socket anschließen.

Um dies zu tun, habe ich den folgenden Code benutzt:

  • Wie bekomme ich einen Python-Server, um Recvline in einen String zu konvertieren?
  • Javascript / python client / webserver Beispiel funktioniert nicht
  • Python TCP socket.recv () kehrt mit nichts zurück, sobald die Verbindung hergestellt ist
  • 'METHODNAME' als Client-Methode gegen irc_'METHODNAME 'in Twisted
  • Wie deaktiviere ich die Schaltfläche "Schließen" in GTK?
  • Python Fastcgi Client
  • import socket import time import random from threading import Thread import thread import subprocess, signal, os class ServerObject: def __init__(self, port): self.socket = '' self.host = '' self.port = port self.conn = '' self.data = '' print "Server port is: ", self.port def openSocketConnectionAsServer(self): self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) self.socket.bind((self.host, self.port)) self.socket.listen(5) self.conn, addr = self.socket.accept() print 'Server Connected by', addr def getData(self): return self.data def getHost(self): return self.host def getPort(self): return self.port def sendMessage(self, message): try : self.conn.sendall(message) except socket.error: print 'Server Send failed' sys.exit() def receiveMessageFromClient(self): while 1: reply = self.conn.recv(4096) if not self.data: break return reply def receiveMessageFromServer(self): reply = self.socket.recv(4096) return reply def closeConnectionAsServer(self): self.socket.shutdown(1) self.socket.close() del self.socket class ClientObject: def __init__(self): self.data = str(random.choice('abcdefghil')) print "Client Data Random: ", self.data self.host = 'localhost' self.port = '' def openSocketConnectionAsClient(self): self.port = 50000 + random.randint(1,3) print "Client socket port is: ", self.port try: self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) except socket.error: print 'Client Failed to create socket' sys.exit() print 'Client Socket Created' try: remote_ip = socket.gethostbyname( self.host ) except socket.gaierror: print 'Client Hostname could not be resolved. Exiting' sys.exit() self.socket.connect((remote_ip , self.port)) def getData(self): return self.data def getHost(self): return self.host def getPort(self): return self.port def sendMessage(self, message): try : self.socket.sendall(message) except socket.error: print 'Client Send failed' os.sys.exit() def receiveMessageFromServer(self): reply = self.socket.recv(4096) return reply def closeConnection(self): self.socket.shutdown(1) self.socket.close() del self.socket def clientProcess(): print "Client Start the client process" client1 = ClientObject() for i in range(1,10): try: print "Client try to open the connection socket: attempt number ",i client1.openSocketConnectionAsClient() print "Client connection socket established on port ", client1.getPort() break except socket.error: print "Client connection error on the port ", client1.getPort() if i == 10: os.sys.exit() print "Client send the message" client1.sendMessage(client1.getData()) print "Client receive the message back" client1.receiveMessageFromServer() print "Client Data requested: ", client1.getData(), " Hostname: ", client1.getHost(), " Port: ", client1.getPort() print "Client Close connection" client1.closeConnection() def serverProcess(port=40007): print "Server oject create" server = ServerObject(port) print "Server open connection as server" server.openSocketConnectionAsServer() print "Server receive the client message" receivedMessage = server.receiveMessageFromClient() message = "Server Data requested are: "+receivedMessage print "Server send the message back to the client" server.sendMessage(message) print "Server close the connection with the client" server.closeConnectionAsServer() if __name__ == '__main__': threadServer = Thread(target=serverProcess, args=[50001]) print "New Server thread created with name: ", threadServer.getName() threadServer.start() for i in range(1,3): threadClient = Thread(target=clientProcess) print "New Client thread created with name: ", threadClient.getName() threadClient.start() threadClient.join() 

    Wenn ich es laufe, kann der erste Client eine Verbindung zum Server herstellen, der zweite wird niemals verbunden, obwohl ich die Verbindung (vom Server und Client-Seite) am Ende des ersten Client-Threads schließt.

    Bitte, könnte mir jemand sagen, was ist in meinem Code falsch?

    Vielen Dank

  • Python - Aufruf von Ahnenmethoden, wenn mehrere Vererbung beteiligt ist
  • Python-Mehrfachvererbung aus verschiedenen Pfaden mit demselben Methodennamen
  • Wie vermeiden Sie unendliche Rekursion mit super ()?
  • Python-Mehrfachvererbung: Was macht das falsch?
  • Aufruf der übergeordneten Klasse __init__ mit mehrfacher Vererbung, was ist der richtige Weg?
  • Erstellen Sie eine interaktive Befehlsschleife mit Vererbung python34
  • 2 Solutions collect form web for “Python-Client-Sockets, die auf demselben Server-Socket-Port verbinden”

    Ich würde es sehr empfehlen, das hervorragende socketserver Modul zu socketserver um so etwas zu machen. Wie für Ihren Code ist das Problem, dass Ihr Thread- Socket-Server nur in einem einzigen Thread läuft. Zumindest sollten Sie einen neuen Thread erstellen, um die Verbindung nach der accept der neuen Verbindung in openSocketConnectionAsServer .

    Was @Ber sagte, war richtig aber unvollständig.

    Sie sind Problem hier:

     self.socket.listen(5) self.conn, addr = self.socket.accept() 

    listen den Hafen auf und bereiten Sie sich vor, um Verbindungen zu erhalten. accept auf die nächste Verbindung.

    Während du nur einmal anrufen musst, musst du mehrmals accept , einmal pro Verbindung. Es gibt mehrere Möglichkeiten, wie man das arrangieren kann. Für Starter kannst du wieder accept , wenn die aktuelle Verbindung schließt, aber das wird nur einen Client zu einem Zeitpunkt erlauben. Besser, um einen Thread-Anruf zu accept , um auf die nächste Verbindung zu warten, aber haben Sie einen Worker-Thread, um jeden zu behandeln.

    Oder Sie könnten non-blocking I / O verwenden , aber wenn Sie diesen Weg gehen, check out Twisted .

    Python ist die beste Programmiersprache der Welt.