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()只取1个参数(给定2个)
这个为什么,我的线程args只给出一个参数,为什么告诉我给出两个参数。
如何理解这一点?
答案 0 :(得分:1)
你以错误的方式调用线程函数。目前,您使用此:
t = threading.Thread(target=handle_client, args=client)
但是,你应该使用它:
t = threading.Thread(target=handle_client, args=(client, ))
如果您阅读docs,您会看到args
参数应该是元组,而不是单个变量。
<强>更新强>
刚刚测试了我的代码,它运行正常。是的,程序仍然会引发错误(AttributeError: 'tuple' object has no attribute 'recv'
),但这是因为您应该使用sock_client[0]
来接收数据(sock_client
本身是一个由连接对象和地址组成的元组)。
所以,正确的代码在这里:
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()