猿问

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

我试图找出一个多线程问题,两个客户端永远运行,同时向服务器发送 ping,而服务器不断回显消息。


在发现一个客户端/服务器如何永远来回回显之后,我研究了多线程。


当我添加第二个客户端时,它将接收第一个客户端的最后一个输出。然后,第二个客户端将与服务器重复回显,而第一个客户端从未收到消息,将其冻结。


我被困在这几天,所以帮助会很好。


无论如何,这是我用来测试的代码:


客户端A.py


import socket

import time


host = '127.0.0.1' 

port = 2004

BUFFER_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:", data2

Clientb.py与客户端 A 相同,但带有 ab


服务器.py


import socket

import time

import thread


from threading import Thread 

from SocketServer import ThreadingMixIn 



BUFFER_SIZE = 1024


TCP_IP = '127.0.0.1' 

TCP_PORT = 2004

tcpServer = 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()


UYOU
浏览 289回答 2
2回答

一只甜甜圈

您的客户端处理程序线程使用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()

阿晨1998

您的原始client函数没有使用传入的连接,而是使用conn在每个连接上覆盖的全局变量。 ip是传递给的连接client。由于您的服务器代码导入了 SocketServer,因此请使用它并简化代码。此代码将为每个客户端连接创建一个线程。 self.request是套接字连接:#!python2import SocketServerclass 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()
随时随地看视频慕课网APP

相关分类

Python
我要回答