套接字刷新python
我用“选择”编码了一个基本的插座系统。我想立即获得已连接客户端的列表 当“选择”的超时时间过去,几个客户端随后出现时,这就是戏剧性的结果 示例-关注事项: 我有3个客户端,其中一个在超时之前连接,另外两个在超时之后连接,因此如果考虑到超时之后的另外两个客户端,我将刷新我的列表 第一个结果:我显示变量“list”,我看到超时前连接的第一个套接字+超时后连接的另一个套接字之一。总计:3个客户中的2个 第二个结果:我仍然重新显示我的变量“list”,三个客户机都在那里 但是我希望列表不必每次都为每个客户重新显示列表,你可以想象我有10个客户,我必须显示我的列表10次 所以我想使用asyncore模块谁更流畅,你怎么看?你有没有办法解决我的问题(更简单)?我应该使用多线程还是留在asyncore或select模块上 编辑代码源代码:套接字刷新python,python,sockets,select,Python,Sockets,Select,我用“选择”编码了一个基本的插座系统。我想立即获得已连接客户端的列表 当“选择”的超时时间过去,几个客户端随后出现时,这就是戏剧性的结果 示例-关注事项: 我有3个客户端,其中一个在超时之前连接,另外两个在超时之后连接,因此如果考虑到超时之后的另外两个客户端,我将刷新我的列表 第一个结果:我显示变量“list”,我看到超时前连接的第一个套接字+超时后连接的另一个套接字之一。总计:3个客户中的2个 第二个结果:我仍然重新显示我的变量“list”,三个客户机都在那里 但是我希望列表不必每次都为每个客
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))
您的帖子很不清楚,但我可以告诉您,问题是您不了解如何使用
select
您发布的代码仅调用“选择一次”。程序进入select()
调用,等待mainConnection
可读(或等待超时)。如果mainConnection
在超时之前变得可读,select()
返回一个可读的文件描述符,然后在for
循环中处理该描述符。但就是这样<代码>选择不会再次调用,因此您的程序不会再检查任何传入连接
几乎在每个应用程序中,select
都应该是一个循环。每次通过循环,程序都会在select()
调用中等待,直到一个或多个套接字准备好读取或写入。当这种情况发生时,select
会为您提供准备好的文件描述符,您的工作就是让其他代码实际执行某些操作。例如,如果select
将套接字的文件描述符返回为可读,则您的任务是在该套接字上调用.recv()
您当然可以使用asyncore。事实上,我认为您应该研究asyncore的源代码,以了解如何正确使用
select
您的帖子非常不清楚,但我可以告诉您,问题是您不了解如何使用select
您发布的代码仅调用“选择一次”。程序进入select()
调用,等待mainConnection
可读(或等待超时)。如果mainConnection
在超时之前变得可读,select()
返回一个可读的文件描述符,然后在for
循环中处理该描述符。但就是这样<代码>选择不会再次调用,因此您的程序不会再检查任何传入连接
几乎在每个应用程序中,select
都应该是一个循环。每次通过循环,程序都会在select()
调用中等待,直到一个或多个套接字准备好读取或写入。当这种情况发生时,select
会为您提供准备好的文件描述符,您的工作就是让其他代码实际执行某些操作。例如,如果select
将套接字的文件描述符返回为可读,则您的任务是在该套接字上调用.recv()
您当然可以使用asyncore。事实上,我认为您应该研究asyncore的源代码,以了解如何正确使用
select
您的代码有三个主要问题:
input
。此功能将被阻止,直到按下ENTER键select
call中检查传入连接。您从不检查任何已连接的套接字是否发送了任何内容这里的主要问题是调用
input
,因为它将完全停止您的程序,直到输入控制台的输入。您的代码有三个主要问题:
input
。此功能将被阻止,直到按下ENTER键select
call中检查传入连接。您从不检查任何已连接的套接字是否发送了任何内容这里的主要问题是调用
input
,因为它将完全停止您的程序,直到输入控制台的输入。select
应在集合中至少有一个套接字就绪时返回。否:/show 3客户端必须返回列表2次…请显示您使用的代码,或者至少是一个。我制作了一个有问题的视频,代码的格式有点不正确,但在我看来,您有一个无限循环,您只在主侦听套接字上调用select
,可能只调用一次(因为格式设置不正确,请记住缩进在Python中很重要)。您不检查任何其他连接的套接字,也不尝试从连接的套接字接收或发送任何数据。select
应在集合中至少有一个套接字就绪时返回。否:/show 3 clients必须返回列表2次…请显示您使用的代码,或者至少一个。我制作了一个有格式问题的视频