python - 在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:如果有人也想要这个客户,就问吧,我会编辑这个帖子把它添加进去。
解决方案
根据您运行的代码,您将获得正确的输出。您的代码有两个问题。第一个问题在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
推荐阅读
- r - R Shiny 确保 pdf 缩放到 iframe 大小
- vue.js - 记录 rootState 和组件的挂载钩子中发生的所有突变?
- bluetooth - 选择频道的蓝牙模块服务模式(认证)
- chart.js - 反向报价单
- java - Java2D Disposer 线程使 JVM 崩溃
- mongodb - 查找比当前日期更高/更低的记录时,我没有得到答案
- javascript - JavaScript 中的切片方法正在删除不需要的字符
- angular - Angular 6 嵌套路由参数
- javascript - 为什么比较相同的数组值和对象返回false?
- python-sphinx - 狮身人面像无限的tocdepth