python - 套接字刷新Python

标签 python sockets select

我用“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))

最佳答案

您的代码存在三个主要问题:

  1. 您在循环中调用input。此函数将阻塞,直到按下ENTER为止。

  2. 如果从控制台输入非整数,则会出现异常。您处理了该异常,但处理错误。您只需尝试再次执行导致异常的相同操作,而不是再次要求输入。

  3. 您仅在 select 调用中检查传入连接。您永远不会检查任何连接的套接字是否发送了任何内容。

这里对您来说的主要问题是对 input 的调用,因为它会完全停止您的程序,直到输入来自控制台的输入。

关于python - 套接字刷新Python,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17264806/

相关文章:

python - 2D numpy 数组输入的 Tensorflow Keras Conv2D 错误

linux - 在 Linux 中对客户端断开连接使用react

c# - 令人沮丧的 TCP 序列化异常 : Binary stream '0' does not contain a valid BinaryHeader

SQL like 日期子句

python - yield 被 zip 调用得太频繁了?

python - 如何修改填充向量的 seq2seq 成本函数?

python - 如何减去QPainterPaths、QPolygon?

java - JSP套接字只发送一次字符串

javascript - 如何将选择值传递给 Angularjs 模态表单

javascript - HTML 选择下拉菜单,Jquery 问题