使用python

时间:2018-09-25 11:58:03

标签: python python-3.x multithreading

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

,但是它只是重复“连接客户端1” 3次。

如果有人能为我解决这个问题,那就太好了

Ps:如果有人也想要客户,只需索要它,我将编辑此帖子以将其添加到其中。

1 个答案:

答案 0 :(得分:1)

根据您运行的代码,您将获得正确的输出。您的代码有两个问题。第一个问题是在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台服务器(类为ThreadedServer的1个对象)。

向方法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