我正在开发一个简单的多人在线文本游戏,我读到
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 返回有数据要读取的套接字列表。确保您在再次调用 select/poll 之前阅读了所有内容,否则您将优先考虑编号较低的端口上的连接。请注意,读取是原始数据,不会以任何方式终止,因此不能直接转储为字符串,除非发送者在写入其套接字时包含 NUL 终止符。