有一个服务器,它接收和发送消息,我想出了发送,通过一个循环到每个,但是在一个循环中接收是行不通的,因为它会接收当前在循环中的那个,其余的将在队列中,这不是您需要的。现在接收消息的代码是什么:
def Reciver():
global conn
while 1:
for i in set(conn):
try:
data = i.recv(1024)
if data:
print(data.decode())
except:
pass
conn - 设置连接。您需要在屏幕上显示每条消息。
socket上的操作阻塞线程执行的问题可以通过三种方式解决:
下面将讨论所有三个选项。
多线程服务器
也许是最常用的方法。可以说是经典。对于线程之间的交互,我们将使用queue.Queue。首先,队列的逻辑正好适合我们。其次,队列是线程安全的。
除了对示例进行必要的代码更改外,我还删除了不必要的全局变量并进行了样式更改。
非阻塞服务器
很古老,但并没有失去它的关联方法。它是古人在单任务操作系统中工作时使用的。要轮询套接字的状态,我们将使用同名模块中的select函数。它不是同类中最快的,但它适用于所有操作系统。
异步服务器
比较新的方式。Asyncio 为使用套接字提供了三个抽象级别——套接字操作、流和协议的异步包装器。名称可能有些混乱,asyncio 线程与执行线程无关,协议与网络协议不同。Ceteris paribus,你应该总是选择最高级别的抽象,所以我们实现协议。
协议代码简单明了,我什至没有找到任何相关的注释。
上面的每个示例都可以通过
telnet
并在您的客户端代码的帮助下进行。