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:如果有人也想要客户,只需索要它,我将编辑此帖子以将其添加到其中。
答案 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