Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/302.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
套接字刷新python_Python_Sockets_Select - Fatal编程技术网

套接字刷新python

套接字刷新python,python,sockets,select,Python,Sockets,Select,我用“选择”编码了一个基本的插座系统。我想立即获得已连接客户端的列表 当“选择”的超时时间过去,几个客户端随后出现时,这就是戏剧性的结果 示例-关注事项: 我有3个客户端,其中一个在超时之前连接,另外两个在超时之后连接,因此如果考虑到超时之后的另外两个客户端,我将刷新我的列表 第一个结果:我显示变量“list”,我看到超时前连接的第一个套接字+超时后连接的另一个套接字之一。总计:3个客户中的2个 第二个结果:我仍然重新显示我的变量“list”,三个客户机都在那里 但是我希望列表不必每次都为每个客

我用“选择”编码了一个基本的插座系统。我想立即获得已连接客户端的列表

当“选择”的超时时间过去,几个客户端随后出现时,这就是戏剧性的结果

示例-关注事项: 我有3个客户端,其中一个在超时之前连接,另外两个在超时之后连接,因此如果考虑到超时之后的另外两个客户端,我将刷新我的列表

第一个结果:我显示变量“list”,我看到超时前连接的第一个套接字+超时后连接的另一个套接字之一。总计:3个客户中的2个

第二个结果:我仍然重新显示我的变量“list”,三个客户机都在那里

但是我希望列表不必每次都为每个客户重新显示列表,你可以想象我有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))

您的帖子很不清楚,但我可以告诉您,问题是您不了解如何使用
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次…请显示您使用的代码,或者至少一个。我制作了一个有格式问题的视频