使用Twisted的Python网络服务

7 投票
4 回答
2869 浏览
提问于 2025-04-16 21:15

这和我之前的问题有关,关于Python网络服务

我打算用Tornado来在服务器和客户端之间交换信息。会有一个服务器和多个客户端。客户端会定期(大约每2分钟)发送信息,比如磁盘使用情况、进程等。客户端的数据会用自定义的类或列表来表示。如果服务器那边也能有相同的数据就更好了。

我有使用SOAP的经验,这个方法可能也能行(只要服务器的超时时间设置得足够长),但我更想用一些更轻量、符合Python风格的东西。通信基本上就是客户端向服务器发送数据。

服务器和客户端的代码都是用Python写的。

我在Twisted的文档中应该关注哪些内容来实现这种功能呢?

编辑:我不是在问如何序列化数据(比如JSON、pickle或XML等)。我想知道Twisted有哪些选项可以用来传输数据。

如果用SOAP,我会有这样的函数:

- sendDiskUsage(DiskUsage class instance)
- sendProcesses(ProcessList class instance)
- etc..

我想知道Twisted有哪些选项。其中一个是XML-RPC,这个可以用,但不是我最喜欢的...

编辑2:通信将是“双向”的——客户端会从服务器读取任务...

4 个回答

1

在数据序列化方面,如果你使用pickle来序列化自定义类的实例,确保服务器和客户端都有相同的类定义。这意味着两边的代码要一致,不然可能会出问题。

关于twisted的参考资料,你可以查看它的文档,特别是“编写TCP服务器”和“编写TCP客户端”这两个部分。

2

你可以试试Twisted的“视角代理”。它有一些不错的功能,比如对称性(一旦连接建立,客户端和服务器之间没有真正的区别)。它自己处理数据的序列化。不过,如果你只是想要一个简单的单向状态更新推送,这可能不是最好的选择。

8

我推荐使用AMP。这个协议非常简单,基于键值对,特别适合你要做的事情。还有一个选择是Perspective broker,但它稍微复杂一些,通常也不太必要。

AMP直接在TCP上运行(为什么还要用HTTP呢?),它的序列化格式既简单又合乎逻辑。这使得它在你可能想的“轻量”和“Python风格”上都表现得很好,不过这些词可能有不同的理解。

你可以看看Twisted的代码示例,这些示例都很容易理解。AMP连接是双向的,所以你可以尝试修改示例,让服务器询问客户端当前的磁盘使用情况。这里的twisted.protocols.amp API文档会对你有帮助。

当你准备好构建一个真正的应用时,可以阅读从零开始学习Twisted,或者《指纹的演变》

AMP已经在大多数流行的编程语言中实现了,但如果你想要更“主流”的东西,protobuf是谷歌的产品。个人认为它有点复杂,而且缺少一些重要的功能,比如错误反馈。

撰写回答