如何防止程序等待从客户端接收消息?

时间:2019-06-19 19:37:30

标签: python python-2.7 sockets networking

我正在创建一个聊天系统,该程序将尝试从每个在线客户端接收消息,但是问题是程序正在等待第一个客户端发送并接收消息,然后它正在侦听另一个。 请参见下面的代码,我简化了代码,但未提供主要代码。

import socket
port = input("Port: ")
s = socket.socket()
s.bind(('', port))
s.listen(5)
a, b = s.accept()
print "Connection", "with", b[0], "Created Successfully"
while True:
    try:
        rec = a.recv(1024)
        print rec
    except:
        print "Time Out"

我希望程序检查rec中是否有任何值(客户端程序是否发送了任何内容),如果没有,它将打印Time Out而无需等待客户端发送任何东西。

4 个答案:

答案 0 :(得分:1)

访问https://docs.python.org/2/library/socket.html#socket-objects 这是针对python2.7的套接字

socket.setblocking(标志) 设置套接字的阻塞或非阻塞模式:如果标志为0,则将套接字设置为非阻塞,否则设置为阻塞模式。最初,所有套接字都处于阻塞模式。在非阻塞模式下,如果recv()调用未找到任何数据,或者send()调用无法立即处理数据,则会引发错误异常;在阻塞模式下,呼叫将阻塞直到可以继续进行。 s.setblocking(0)等同于s.settimeout(0.0); s.setblocking(1)等同于s.settimeout(None)。

socket.settimeout(值) 在阻止套接字操作上设置超时。 value参数可以是表示秒的非负浮点数,也可以是None。如果给出浮点数,则在操作完成之前已超过超时时间值,则随后的套接字操作将引发超时异常。将超时设置为“无”将禁用套接字操作的超时。 s.settimeout(0.0)等同于s.setblocking(0); s.settimeout(None)等同于s.setblocking(1)。

答案 1 :(得分:1)

多线程编程:您需要通过线程运行您的侦听功能。

答案 2 :(得分:0)

答案 3 :(得分:-1)

您的问题是特定于操作系统的。

使用select & poll - Waiting for I/O completion操作。可能是selectors模块。或找到一些event loop模块。

您可能需要阅读ALP才能了解如何使用Linux system calls(列在syscalls(2)中;有关poll(2)的信息)

您可以阅读Operating System: Three Easy Pieces来了解有关操作系统的更多信息。