【发布时间】:2018-06-29 20:15:20
【问题描述】:
我目前正在构建一个 TCP 服务器(该服务器将由我的公司使用,因此它必须处于高生产级别)
我的要求是:
服务器会很快(它可以同时处理大量请求,因为我们的客户端会定期发送大文件,这会造成瓶颈)。
服务器将易于维护。
同时支持尽可能多的用户。
那个服务器会是TCP服务器,因为它接收我们公司开发的协议消息,需要我自己解析。
在检查了选项之后,我选择了 Python Twisted,因为他似乎满足了第一个要求(而且由于他是在 Python 中,所以第二个要求自己解决了)。
在阅读了 Twisted 的文档后,我想到了一个我还没有找到优雅答案的问题,我的客户向我发送了相当大的数据包,我在这些数据包中做出基于子序列的决策。
假设我有 1000 个全为零的第一个字节,然后是另外 5,000 个全为 0x10 的字节,我将发回“Hello world”,如果我得到 2000 个全为 0x50 的字节,我将回答“大家好”。
我对 Twisted 的问题是数据最终会到达“protocol.Protocol”,并使用“dataReceived(self,data)”函数处理它们,而这一瞬间是一次性瞬间,这意味着如果我第一次只获取一些字节,我将在第二次获取其余字节我不知道如何从第一次保存数据...
我无法将数据保存在协议工厂中,因为我将同时与多个客户端对话,然后一个将使用另一个客户端的数据,出于同样的原因,我不能使用 Globals。
我很确定我不是第一个遇到这个问题的人,我已经看到了几个在线解决方案,其中包括重新实现“protocol.Protocol”,它们确实不够优雅..
有没有简单优雅的方法来解决这个问题? (解决方案必须优雅,因为我在其上添加了多线程,因为我回馈给客户端的内容远不止“Hello World”,而且我不想阻塞服务器)
顺便说一句,如果有经验的人可以为我推荐比 Twisted 更好的解决方案,我会非常高兴。
谢谢
洋子
【问题讨论】:
标签: python multithreading tcp twisted serve