我用“select”编写了一个基本的套接字系统。我想立即获取已连接客户端的列表。
当“select”的超时时间过去并且几个客户端随后到来时,这就是戏剧性的事情..
示例 - 关注点: 我有 3 个客户端,其中一个在超时之前连接,另外 2 个客户端在超时后连接,因此如果在超时后考虑到其他两个客户端,我将刷新我的列表。
第一个结果:我显示变量“列表”,我看到超时前连接的第一个套接字+超时后连接的另一个套接字。总数:3 个客户中的 2 个
第二个结果:我仍然重新显示我的变量“列表”,并且三个客户端都在那里......
但我想要列表,而不必每次为每个客户重新显示列表,你可以想象我有 10 个客户,我必须显示我的列表 10 次
所以我想到使用更流畅的asyncore模块,你觉得怎么样?你有一个解决方案给我吗(更简单)?我应该使用多线程还是留在 asyncore 或 select 模块上?
编辑代码来源:
import socket, select
hote = ''
port = 81
mainConnection = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
mainConnection.bind((hote, port))
mainConnection.listen(5)
print("Listen to {}".format(port))
client_online = []
while True:
connection_access, wlist, xlist = select.select([mainConnection], [], [], 10)
for connexion in connection_access:
connection_client, infos_connexion = connexion.accept()
client_online.append(connection_client)
refresh = input(">>> ")
while True:
try:
refresh = int(refresh)
except ValueError:
print("Not allowed")
refresh = int(refresh)
else:
break
if refresh == 1:
print("List client : {}".format(client_online))
最佳答案
您的代码存在三个主要问题:
您在循环中调用
input
。此函数将阻塞,直到按下ENTER为止。如果从控制台输入非整数,则会出现异常。您处理了该异常,但处理错误。您只需尝试再次执行导致异常的相同操作,而不是再次要求输入。
您仅在
select
调用中检查传入连接。您永远不会检查任何连接的套接字是否发送了任何内容。
这里对您来说的主要问题是对 input
的调用,因为它会完全停止您的程序,直到输入来自控制台的输入。
关于python - 套接字刷新Python,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17264806/