我正在编写一个客户端,需要建立多个独立的通信通道,每个通道在服务器上都有自己独特的端口,服务器通过一系列发送和接收消息。我知道如何使用套接字send和recv,给每个通信通道一个套接字,并在该套接字上发送和recv。我需要在Twisted中完成这项工作,并找到了可能有用的接口,包括Factory和ProcessProtocol。但是,协议接口不提供发送消息的方法。 ProcessProtocol是我的任务的好选择,以及我如何使ProcessProtocol发送消息?
答案 0 :(得分:1)
如果你不了解它,我想以优秀的速度向图书馆的优秀Twisted finger
tutorial大声喊叫,但要有足够的细节,你知道发生了什么。
要直接回答你的问题,我会说你在使用Protocol和(Client)Factory走在正确的轨道上。我认为最简洁的方法来做你正在寻找的东西(假设你需要连接到不同的端口,因为它们是不同数据的输出)将为你想连接/处理的每个端口建立一个工厂/协议对,然后使用外部类来处理聚合所有这些的应用程序逻辑。通常,您不希望您的应用程序逻辑与您的网络逻辑深深混合。
一个简单的例子:(注意使用self.transport.write发送数据)
from twisted.internet.protocol import Protocol, ClientFactory
from sys import stdout
from foobar_application import CustomAppObject
class FooProtocol(Protocol):
def connectionMade(self):
# Use self.transport.write to send data to the server
self.transport.write('Hello server this is the Foo protocol.')
self.factory.do_app_logic()
class FooFactory(ClientFactory):
protocol = FooProtocol
def __init__(self, app_object=None):
self.app = app_object
def do_app_logic(self):
self.app.do_something()
class BarProtocol(Protocol):
def dataReceived(self, data):
stdout.write('Received data from server using the Bar protocol.')
self.factory.do_fancy_logic(data)
class BarFactory(ClientFactory):
protocol = BarProtocol
def __init__(self, app_object=None):
self.app = app_object
def do_fancy_logic(self, data):
self.app.do_something_else(data)
logic_obj = CustomAppObject()
reactor.listenTCP(8888, FooFactory(app_object=logic_obj)
reactor.listenTCP(9999, BarFactory(app_object=logic_obj)
reactor.run()