【发布时间】:2015-08-09 02:54:21
【问题描述】:
我要制作一个基于 web 的实时游戏,这需要使用 websockets(请不要在此处指向我的 Flash),因此我需要一个也支持 websockets 的后端服务器。出于多种原因,我决定使用 Python,但是我很难找到合适的库。具体来说,它必须在常规套接字之上实现 websocket,而不是作为不透明的黑盒。因为实际上,websockets 只不过是传统的套接字,除了非常具体的握手。
我已经浏览了许多 Python websocket 支持库,但它们似乎都没有公开 实际套接字 功能,也许我遗漏了一些东西,但我找不到任何东西.它们似乎都实现了您定义套接字解析器的行为(这是整个应用程序的基石)然后启动库的主循环的模式。这不合适,因为 1) 网络循环不会是这里的主循环,2) 套接字仅用于来回传输数据,仅此而已。
那么有没有这样的库可以让我像使用常规套接字一样使用 websockets 而不是抽象的 web 服务器数据端口,或者我真的最好从现有的库中提取有问题的功能并像往常一样继续使用?
【问题讨论】:
-
但是 websockets 不只是套接字。即使在握手之后,websockets 也是帧消息流,而不是字节流。除非您打算自己进行框架(和 TCP 标头操作),否则您不能只将 websocket 套接字用作 TCP 套接字。
-
@abarnert 根据我的阅读,它们是只是套接字,带有专门负责 websocket 处理的小额外标头。任何游戏网络库都实现了类似的东西。那里没什么可怕的。
-
好吧,那你还没有仔细阅读。 Websockets 在 TCP 之上分层了一个框架机制。正如原始文档所说,它“尽可能接近将原始 TCP 暴露给脚本,但不会更接近”。如果你只是把它当作原始 TCP,你将无法与浏览器通信。
-
@abarnet 是的,我明白了。 websockets 本身并没有什么特别之处,这使得它们与常规套接字有任何不同。如果将解析握手和标头放在包装函数下,则常规套接字和 websocket 在使用方面是无法区分的。
-
不,它们确实是可区分的。您发送和接收消息,而不是字节。这是一个根本的区别。这意味着只是做,例如,
epoll或select以查看是否有要阅读的内容不是很有帮助,因为除非有消息的最后一帧,否则仍然没有要处理的内容。