我正在开发一个简单的多人在线文本游戏,我阅读了select()
,poll()
是多路复用I/O的流行方法。
我在 GNU C 文档中找到了这个例子,它使用 select
.我运行它并制作了 3 个 Python 测试客户端,如下所示:
import socket
import time
port = 5555
test = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
test.connect(('localhost', port))
while 1:
test.send('aaaa')
time.sleep(0.5)
然后我使用不同的字符串(aaaa
、55
和 ..
)运行客户端(从运行服务器的同一台计算机)。
服务器的输出是
Server: got message: `aaaa'
Server: got message: `55aa'
Server: got message: `aaaa'
Server: got message: `55aa'
Server: got message: `..aa'
琴弦越来越混乱。
这是某种愚蠢的编译错误,测试客户端中的错误还是我在同一台计算机上运行客户端和服务器的事实?或者这个程序告诉我我不应该为此目的使用select
?考虑到我将它用于多人游戏服务器(每秒可能会收到大量消息),我认为我不能让消息混淆。
客户端和服务器是完全异步的。 您不知道哪个会在CPU上花费时间以及以什么顺序。 网络也不保证传递顺序(尽管TCP将确保应用程序按照发送顺序从单个客户端看到数据)。
选择/轮询返回具有要读取的数据的套接字列表。 确保在再次调用 select/poll 之前阅读所有内容,否则您将优先考虑编号较低的端口上的连接。
请注意,读取是原始数据,不会以任何方式终止,因此不能直接作为字符串转储,除非发送方在写入其套接字时包含 NUL 终止符。