如何使用twisted组织多连接客户端?

2 投票
1 回答
564 浏览
提问于 2025-04-18 01:11

我刚接触Twisted这个框架,正在努力搞清楚该如何组织我的代码。我的客户端需要先连接到一个TCP(SSL)控制通道,然后再尝试通过UDP连接到同一个IP和端口,以便建立一个低延迟的数据通道,这个连接的加密设置是通过TCP提供的。如果UDP连接失败,就会使用TCP控制通道来传输数据。我想写一个可重用的客户端,让用户可以重写一些函数,比如dataReceived、controlMessageXReceived、sendControlMessageX、sendDataMessage等,而是否使用UDP通道的细节则由我的代码来处理。

目前我有一个可以理解TCP控制通道的协议;为了测试,我在ConnectionMade()函数里重写了一些内容,发送设置消息并确认一切正常(也就是说,它能理解服务器的消息,服务器也能理解它的消息),但我不知道如何将这个整合到更大的上下文中。

(顺便提一下,这是一个用于Mumble的客户端——这个协议的详细说明在这里,我正在尝试把这段糟糕的多线程代码更新成现代的版本)

1 个回答

1

考虑一下在Twisted中已经存在的协议和传输的分离。

Protocol(协议)并不知道TCP是什么。它只知道如何处理一串字节。真正了解TCP(或者TLS,或者UNIX套接字,或者其他东西)的,是传输部分。

Protocol和它的传输之间有一个明确的接口(实际上有两个 - IProtocol让传输知道可以对协议对象做什么,而ITransport让协议知道可以对传输对象做什么)。

为你正在开发的应用程序设计一个合理的接口。例如,Protocol有一个dataReceived方法,因为“有字节到达”是处理“字节流”时会发生的事情之一。在Mumble中会发生什么事情呢?比如“一个用户连接到服务器”或者“你所在频道里有消息到达”。你的接口可以为这些情况各自设计一个方法。

现在,应用程序开发者可以通过实现这个接口来编写自己的新行为,这个接口是明确且完整定义的,然后将这个实现接入到你的库中(例如,你的库可以提供一个connectToMumbleServer(address, mumbleApplicationObject)的API)。

你的库清楚地知道可以对应用对象做什么,因为接口是明确定义的。如果你反向重复这个过程,那么应用开发者也会知道他们可以用你的库对Mumble服务器做什么(比如“加入一个频道”或“发送一段音频数据”)。

你可以提供一个基类(像Protocol那样)供应用程序去继承,但这只是一个很小的便利。如果你最近没有这样做,可以打开twisted/internet/protocols.py,看看Protocol类的实现。里面几乎没有什么内容,而且那些内容也不复杂,容易复制。如果应用开发者必须从object开始继承,并自己输入所有方法,他们也不会处于太大的劣势。

撰写回答