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

时间:2017-03-23 12:57:59

标签: multithreading python-3.x tcp echo-server

我在python 3.6中创建了一个多线程TCP Echo Server,一切正常(我可以向服务器发送消息并回显它们),直到我尝试发送一个消息与第二个客户端没有收到并且如果我尝试发送第二个给我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()阻止,因此它无法保存第二个客户端的新值,但我不确定。然后我又希望能够让两个客户"说话"到服务器并分别接收" echo消息"发送时 这是我的客户代码(两者都是):

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

我在这里做错了什么?

1 个答案:

答案 0 :(得分:0)

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

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

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