为了账号安全,请及时绑定邮箱和手机立即绑定

Python多线程两个客户端在一台服务器上无限期地同时运行

Python多线程两个客户端在一台服务器上无限期地同时运行

UYOU 2022-01-11 15:45:49
我试图找出一个多线程问题,两个客户端永远运行,同时向服务器发送 ping,而服务器不断回显消息。在发现一个客户端/服务器如何永远来回回显之后,我研究了多线程。当我添加第二个客户端时,它将接收第一个客户端的最后一个输出。然后,第二个客户端将与服务器重复回显,而第一个客户端从未收到消息,将其冻结。我被困在这几天,所以帮助会很好。无论如何,这是我用来测试的代码:客户端A.pyimport socketimport timehost = '127.0.0.1' port = 2004BUFFER_SIZE = 2000 tcpClientA = socket.socket(socket.AF_INET, socket.SOCK_STREAM) tcpClientA.connect((host, port))while True:    data = 'this is client A'    tcpClientA.send(data)    data2 = tcpClientA.recv(BUFFER_SIZE)    print " Client A received data:", data2Clientb.py与客户端 A 相同,但带有 ab服务器.pyimport socketimport timeimport threadfrom threading import Thread from SocketServer import ThreadingMixIn BUFFER_SIZE = 1024TCP_IP = '127.0.0.1' TCP_PORT = 2004tcpServer = socket.socket(socket.AF_INET, socket.SOCK_STREAM) tcpServer.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) threads = []def client(ip,port):    while True:        data = conn.recv(2048)        conn.send(data)    conn.close()print "Server waiting"tcpServer.bind((TCP_IP, TCP_PORT))tcpServer.listen(4)while True:    conn,addr=tcpServer.accept()    thread.start_new_thread(client,(conn,addr))tcpServer.close()
查看完整描述

2 回答

?
一只甜甜圈

TA贡献1836条经验 获得超5个赞

您的客户端处理程序线程使用conn在主线程中分配的变量中的套接字来接收和发送数据。基本上,您总是只使用创建的最后一个连接。

这通常在第二个客户端的输出中变得可见,就在启动它之后:


Client B received data: this is client A

从此时起,两个客户端处理程序线程都只为客户端 B 服务,因为这部分client功能......


    data = conn.recv(2048)

    conn.send(data)

...使用conn主线程中的这个(套接字),每次新客户端连接到服务器时都会被覆盖:


conn, addr = tcpServer.accept()

此时客户端 A 等待来自服务器的数据:


data2 = tcpClientA.recv(BUFFER_SIZE)

但是由于服务器中的两个客户端处理程序线程只侦听和写入客户端 B 连接时创建的套接字,因此客户端 A 进程不再接收数据并无限期地阻塞等待一些数据。


您已经将相应的连接传递给您的客户端处理程序线程...


thread.start_new_thread(client, (conn, addr))

...你只需要使用它:


def client(ip,port):

    while True:

        data = ip.recv(2048)  # receive from ip

        ip.send(data)         # send to ip

    conn.close()


查看完整回答
反对 回复 2022-01-11
?
阿晨1998

TA贡献2037条经验 获得超6个赞

您的原始client函数没有使用传入的连接,而是使用conn在每个连接上覆盖的全局变量。 ip是传递给的连接client。


由于您的服务器代码导入了 SocketServer,因此请使用它并简化代码。此代码将为每个客户端连接创建一个线程。 self.request是套接字连接:


#!python2

import SocketServer


class Handler(SocketServer.StreamRequestHandler):

    def handle(self):

        while True:

            data = self.request.recv(2048)

            if not data: break

            self.request.sendall(data)


server = SocketServer.ThreadingTCPServer(('',2004),Handler)

server.serve_forever()


查看完整回答
反对 回复 2022-01-11
  • 2 回答
  • 0 关注
  • 240 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信