我在 python 3.6 中创建了一个多线程 TCP Echo 服务器,一切正常(我可以向服务器发送消息并将它们回显),直到我尝试使用第二个未收到的客户端发送消息并且如果我尝试发送第二个给了我 BrokenPipe 错误。我在网站上环顾四周,但我发现的只是 python 2.7 的解决方案,并提到了我在线程模块文档中没有找到的 ThreadingMixIn 函数。这是我的服务器代码:
#!/usr/bin/env python3
import socket,sys,threading
def accept_connection(tcp_socket):
(client_socket,(ip,port))=tcp_socket.accept()
print("Accepted connection from %s on port %d"%(ip,port))
return (client_socket,ip,port)
def client_action(client_socket,ip,port):
data=client_socket.recv(2048)
print("Sending back: %s to %s on %d"%(data.decode(),ip,port))
client_socket.send(data)
tcp_socket=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
tcp_socket.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
tcp_socket.bind((sys.argv[1],int(sys.argv[2])))
tcp_socket.listen(2)
print("Listening incoming connections...")
(client_socket,ip,port)=accept_connection(tcp_socket)
while True:
Connections_Handler=threading.Thread(target=accept_connection,args=(tcp_socket,))
Connections_Handler.start()
Client_Handler=threading.Thread(target=client_action,args=(client_socket,ip,port,))
Client_Handler.start()
Client_Handler.join()
我认为问题可能是 client_socket 可能被 Client_Handler.join() 阻止,因此它无法保存第二个客户端的新值,但我不确定。然后我再次希望有可能让两个客户端与服务器“交谈”并在发送时分别接收它们的“回声消息”。这是我的客户代码(两者):
#!/usr/bin/env python3
import socket,sys
tcp_socket=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
tcp_socket.connect((sys.argv[1],int(sys.argv[2])))
print("Connecting to server %s on port %d..."%(sys.argv[1],int(sys.argv[2])))
while True:
message=input("Input message to send: ")
tcp_socket.send(message.encode())
print(tcp_socket.recv(2048).decode())
我在这里做错了什么?