2017-11-03 6 views
-1
import threading 
import socket 

sock = socket.socket() 
sock.bind(('0.0.0.0', 9999)) 
sock.listen(5) 

def handle_client(sock_client): 
     data = sock_client.recv(4096) 
     while data: 
       sock_client.send("this is server: " + data) 
       data = sock_client.recv(4096) 
     sock_client.close() 

while True: 
     client = sock.accept() 
     t = threading.Thread(target=handle_client, args=client) 
     t.start() 

Typeerror: handle_client() nimmt genau 1 Argument (2 angegeben)Buchse threading.Thread args nimmt genau 1 Argument (2 angegeben)

das Warum, nur mein Thread args einen Parameter geben, warum mir sagen, um zwei Parameter zu geben.

wie das zu verstehen?

Antwort

1

Sie rufen die Threading-Funktion falsch auf. Derzeit Sie verwenden:

t = threading.Thread(target=handle_client, args=client) 

Allerdings sollten Sie verwenden:

t = threading.Thread(target=handle_client, args=(client,)) 

Wenn Sie die docs lesen, werden Sie sehen, dass args Parameter ein Tupel sein sollte, und nicht eine einzelne Variable .

Update:

Nur mein Code getestet, es funktioniert gut. Ja, Programm wird weiterhin einen Fehler (AttributeError: 'tuple' object has no attribute 'recv') auslösen, aber das liegt daran, dass Sie sock_client[0] verwenden sollten, um Daten zu empfangen (sock_client selbst ist ein Tupel, das aus Verbindungsobjekt und Adresse besteht).

So ist die richtige Code hier:

import threading 
import socket 

sock = socket.socket() 
sock.bind(('0.0.0.0', 9999)) 
sock.listen(5) 

def handle_client(sock_client): 
     conn = sock_client[0] 
     address = sock_client[1] 
     data = conn.recv(4096) 
     while data: 
       conn.send("this is server: " + data) 
       data = conn.recv(4096) 
     conn.close() 

while True: 
     client = sock.accept() 
     t = threading.Thread(target=handle_client, args=(client,)) 
     t.start() 
+0

Aber die endgültigen Ergebnisse sind gleich, wenn nur ein Parameter, kein Tupel, wird es in ein Tupel umgewandelt werden. -> /root/s.py (10) handle_client() -> sock_client = args [0] (PDB) p args (( ('172.16.0.48', 49524)),) – Paul

+0

Was meinst du mit "der Effekt ist gleich"? Erhalten Sie denselben Fehler erneut? – Fejs

+0

Ja, denselben Fehler erneut erhalten. Python 2.7.5 – Paul

Verwandte Themen