有没有公​​布* socket *功能的Python websocket库?

时间:2015-05-27 07:05:34

标签: python websocket backend

我要制作一个基于网络的实时游戏,这需要使用websockets(请不要在这里指向我),所以我需要一个也支持websockets的后端服务器。我决定使用Python有很多原因,但是我找不到合适的库。具体来说,它必须在常规插座上实现websockets,而不是不透明的黑盒子。因为实际上,websockets只不过是传统的套接字,除非是非常具体的握手。

我已经浏览了许多支持Python websocket的库,但是它们似乎都没有公开实际的socket 功能,也许我错过了一些东西,但我找不到任何东西。它们似乎都实现了您定义套接字解析器行为(它是整个应用程序的基石)的模式,然后启动库的主循环。这不合适,因为1)网络循环不会成为主循环,2)套接字仅用于来回传输数据,仅此而已。

那么是否有这样的库允许我使用像常规套接字这样的websockets而不是抽象的webserver数据端口,或者我真的更好的只是从现有的库中删除有问题的功能并继续像往常一样?

2 个答案:

答案 0 :(得分:1)

你要求的东西没有意义。

你认为,在初始握手之后,websockets只是TCP套接字。

但他们不是。 websocket是消息的流,而不是字节的流。正如Protocol Overview所述:

  

握手成功后,客户端和服务器将数据传回      在本说明书中称为的概念单元中      "消息&#34 ;.在线上,消息由一个或多个组成      帧。 WebSocket消息不一定对应于a      特定的网络层成帧,可能是碎片消息      由中间人合并或分割。

     

帧具有关联类型。每个帧属于同一个      消息包含相同类型的数据。从广义上讲,有      文本数据的类型(解释为UTF-8 RFC3629      文本),二进制数据(其解释留给了      应用程序)和控制框架(不打算携带)      应用程序的数据,而不是协议级信令,      例如,表示连接应该关闭)。这个      协议的版本定义了六种帧类型,并留下十种      留作将来使用。

请参阅Design Philosophy了解其工作原理,并Data Framing了解更详细的信息。

因此,如果您只是从websocket下面取出TCP套接字并开始发送无框数据,那么另一方将无法理解您,只会断开连接。

(您还会破解大多数代理,因为如果您不使用TLS和清理关闭处理,代理支持依赖于帧屏蔽,但如果您甚至无法执行最基本的操作点对点沟通,谁在乎?)

当然,您可以在 websockets之上构建一个API ,它公开面向连接且可靠(如TCP)但基于数据报(如UDP)的套接字接口,然后假装你'不使用websockets ...但如果您正在寻找实时,低延迟的网络,那么当您找到需要优化的东西时,添加另一层使得难以尽可能接近金属的层并不会这似乎是一个好主意。或者,如果你想要那样,我怀疑你最好建立一个严密优化的网关,将localhost UDP与你的实际服务器和websockets连接到你的客户端。

与此同时,您声称有asynciotwisted

之类的内容
  

...并不合适,因为1)网络环路不会成为主循环,2)套接字仅用于来回传输数据,仅此而已。

1)asynciotwisted(虽然不是大多数其他网络库)允许您从另一个循环驱动其消息循环,只需手动运行循环的一次迭代而不是永远运行。

2) else 是如何使用套接字的,在哪里

答案 1 :(得分:0)

我认为Twisted可能就是你所需要的:

http://twistedmatrix.com/trac/export/29073/branches/websocket-4173-2/doc/web/howto/websocket.xhtml

这里有一篇关于它的文章,您想了解套接字以及如何实现它们:

http://www.fullstackpython.com/websockets.html

我建议仔细检查,然后决定你想怎么做。我想说除非你想用于学术目的,否则没有必要重新发明轮子。使用现有的东西有助于更快地完成工作。手动完成也没有利用Python拥有如此强大的库这一事实。