2017-11-13 1 views
1

Ich fing an, Networking mit Python zu lernen, kann mir jemand mit diesem Code helfen, da ich nicht in der Lage bin, mehr als 5 Klienten gleichzeitig zu verbinden. Kann mir bitte jemand eine Lösung vorschlagen?Wie erstellt man einen TCP-Server in Python?

def main(): 
    try: 
     s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
     s.bind(('', listening_port)) 
     s.listen(5) 
     print "[*] Initializing Sockets ... Done" 
     print "[*] Sockets Binded Successfully ..." 
     print("[*] Server Started Successfully [%d]\n" % (listening_port)) 
    except Exception, e: 
     print e 
     sys.exit(2) 
    while 1: 
     try: 
      conn, addr = s.accept() 
      data = conn.recv(buffer_size) 
      start_new_thread(conn_string, (conn, data, addr)) 
     except KeyboardInterrupt: 
      s.close() 
      print "\n[*] Proxy Server Shutting Down ..." 
      sys.exit(1) 
    s.close() 

def conn_string(conn, data, addr): 
    print conn 
    print addr 
    print data 
+0

start_new_thread ist eine integrierte Funktion der Thread-Bibliothek. [Hier] (https://docs.python.org/2/library/thread.html) –

Antwort

0

Wie in der Python-Socket-API beschrieben:

socket.listen (Rückstand)

Hören für an die Buchse hergestellten Verbindungen. Das Backlog-Argument gibt die maximale Anzahl der in der Warteschlange befindlichen Verbindungen an und sollte mindestens 0 sein; der Maximalwert ist systemabhängig (in der Regel 5), wird der Minimalwert auf 0

gezwungen

die Zahl von 5 bis die Anzahl der gleichzeitigen Verbindungen erhöhen Sie mit dem Server haben mögen.

+0

Das ist falsch. Das Listen-Backlog gibt an, wie viele Verbindungen in die Warteschlange gestellt werden können. Der Server-Thread akzeptiert nur die TCP-Sitzung und verschiebt die Arbeit in einen anderen Thread, so dass es wieder in den Hörmodus wechseln kann. – Vinny

0

Die angenommene Antwort ist falsch. Ich werde versuchen, Ihnen zu erklären, warum.

listen nimmt ein Argument von in Warteschlange eingereihten Verbindungen. Das bedeutet, wie viele neue Verbindungen in die Warteschlange eingereiht werden können. Aus diesem Grund ist es sogar in der Dokumentation 5 angegeben, während Server normalerweise mehr als 5 gleichzeitige Clients bedienen.

Sobald ein Socket erstellt (akzeptiert) wird, wird er an einen anderen Thread weitergeleitet, der die eigentliche Arbeit ausführt. Dies ermöglicht es dem Thread listening, in den Abhörmodus zurückzukehren und auf weitere Clients zu warten.

Das Problem mit Ihrem Code ist, Ihr Hauptthread, die das Hören Thread tatsächlich liest Daten aus dem Puffer, wo es nicht sollte. Die recv() Funktionsblöcke (lesen Sie mehr über I/O-Stream-Blockierung)

Sie müssen den Lesevorgang vom Listening-Thread zum Worker verschieben; und stellen Sie sicher, close() die Steckdose, wenn es fertig ist. Der Code würde etwa so aussehen:

def main(): 
    try: 
     ... 
     s.listen(5) 
    except Exception, e: 
     ... 
    while 1: 
     try: 
      conn, addr = s.accept() 
      start_new_thread(conn_string, (conn, addr)) 
     except KeyboardInterrupt: 
      s.close() 
      print "\n[*] Proxy Server Shutting Down ..." 
      sys.exit(1) 
    s.close() 

def conn_string(conn, addr): 
    data = conn.recv(buffer_size) 
    print conn 
    print addr 
    print data 
    conn.close() 
Verwandte Themen