Python 3.6 用于多个客户端的多线程 TCP Echo Server

Python 3.6 Multithread TCP Echo Server for more than one client

我在 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() 阻止,因此它无法保存第二个客户端的新值,但我不是当然。然后我再次希望能够让两个客户端 "talking" 到服务器并在发送时分别接收它们 "echo message" 。 这是我的客户代码(他们都是):

#!/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())

我哪里做错了?

您有一个主要的设计问题:您在一个线程 (ConnectionsHandler) 中接受了一个连接,returns 客户端套接字...什么都没有!然后启动第二个线程以在与新接受的客户端套接字无关的客户端套接字上回显数据。

您应该在主线程中接受调用,然后启动一个新线程来回显数据。顺便说一句,你永远不会关闭任何坏的套接字。

请编写正确使用已接受套接字的单线程正确程序,并在尝试多线程之前关闭它。