0

我在 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())

我在这里做错了什么?

4

1 回答 1

0

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

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

请编写一个正确的单线程程序,该程序正确使用接受的套接字,并在完成后关闭它,然后再尝试对其进行多线程处理。

于 2017-03-23T13:13:30.123 回答