首页 > 解决方案 > 在python中进行线程处理时的面向对象比较的问题

问题描述

我在 python 方面还不错,我尝试制作一个线程套接字客户端,但是我在我的代码中遇到了一个我无法解决的问题。这是代码:

import socket
import threading
class ThreadedServer(object):
    def __init__(self, host, port, num):
        self.num = num
        self.host = host
        self.port = port
        self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        self.sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
        self.sock.bind((self.host, self.port))

    def listen(self):
        self.sock.listen(1)
        while True:
            client, address = self.sock.accept()
            client.settimeout(600)
            threading.Thread(target = self.listenToClient,args = (client,address)).start()

    def listenToClient(self, client, address):
        size = 1024
        # fix this, please
        if self.num == 1:
            print("Client 1 connected")

        if self.num == 2:
            print("Client 2 connected")

        if self.num == 3:
            print("Client 3 connected")
        while True:
                data = client.recv(size)
                data = data.decode("utf-8")
                print("Client", self.num, ": ", data)                


                #   Reply 
                if data == "lad":
                    response = "nice"
                else:
                    response = data



                client.send(response.encode('utf-8'))



if __name__ == "__main__":
    while True:
        host = input("Host? ")
        port_num = input("Port? ")
        try:
            port_num = int(port_num)
            print("Please connect client")            
            break
        except ValueError:
            pass

    ThreadedServer(host,port_num, 1).listen()
    ThreadedServer(host,port_num, 2).listen()
    ThreadedServer(host,port_num, 3).listen()

    ThreadedServer.listenToClient()

你看,当我运行它时,我还将它连接到一个相当简单的客户端,它向我发送数据。在这段代码中,我收到的数据被广泛称为“数据”。我在这段代码中遇到的问题是,在我重复“if self.num:”的部分中,我计划在我连接 3 个客户端时给我以下代码:

Client 1 connected
Client 2 connected
Client 3 connected

但它只是重复 'Client 1 connected' 3 次。

如果有人可以尝试为我解决这个问题,那就太好了,在此先感谢

Ps:如果有人也想要这个客户,就问吧,我会编辑这个帖子把它添加进去。

标签: pythonpython-3.xmultithreading

解决方案


根据您运行的代码,您将获得正确的输出。您的代码有两个问题。第一个问题在main suite. 看线ThreadedServer(host,port_num, 1).listen()。它说:创建类的对象ThreadServer并调用listen()永远运行的方法(永远监听连接)。您将永远不会再启动 2 台服务器ThreadedServer(host,port_num, 2).listen()ThreadedServer(host,port_num, 3).listen(). 这很好,但应该修复。因此,您有 1 台服务器可以接受多个连接。但是你计算的是服务器而不是客户端(这是第二个问题,它会给你带来你不期望的输出)。

解决方案如下。

仅运行 1 个服务器(1 个类对象ThreadedServer)。

在方法中添加计数器listen()

def listen(self):
    counter = 0
    self.sock.listen(1)
    while True:
        client, address = self.sock.accept()
        client.settimeout(600)
        counter += 1
        threading.Thread(
            target=self.listenToClient,
            args=(client, address, counter)).start()

listenToClient()稍微改变方法:

def listenToClient(self, client, address, client_id):
    size = 1024
    print("Client {} connected".format(client_id))
    while True:
            data = client.recv(size)
            data = data.decode("utf-8")
            print("Client", self.num, ": ", data)
            #   Reply
            if data == "lad":
                response = "nice"
            else:
                response = data
            client.send(response.encode('utf-8'))

你会得到输出:

Client 1 connected
Client 2 connected
Client 3 connected

推荐阅读