2015-08-07 3 views
0

Я пишу клиент, которому необходимо установить несколько независимых каналов связи, каждый со своим собственным уникальным портом на сервере, с сервером через серию отправляющих и получающих сообщений. Я знаю, как это сделать, используя сокет send и recv, предоставляя каждому каналу связи сокет и отправляйте его и возвращайте в этот сокет. Мне нужно сделать эту работу в Twisted и найти потенциально полезные интерфейсы, включая Factory и ProcessProtocol. Однако интерфейсы протокола не предоставляют способ отправки сообщений. Является ли ProcessProtocol хорошим выбором для моей задачи и как я могу отправить сообщения ProcessProtocol?Применение Twisted Python в соединениях TCP/IP?

+0

Я понятия не имею, что вы здесь задаете. Вы просто хотите отправить данные? Вам нужны дискретные границы сообщений? Какую документацию вы уже прочитали? Прошли ли вы через учебник Twisted? – Glyph

ответ

1

В случае, если вы об этом не знаете, я бы хотел рассказать об отличном Twisted finger tutorial, который проходит через библиотеку в хорошем темпе, но с достаточной детализацией, что вы знаете, что происходит.

Чтобы ответить на ваш вопрос, я бы сказал, что вы на правильном пути с протоколом и (клиентским) заводом. Я думаю, что самый чистый способ сделать то, что вы ищете (при условии, что вам нужно подключаться к разным портам, потому что они являются выходами для разных данных) было бы создание пары фабрики/протокола для каждого порта, который вы хотите подключить к/, а затем использовать внешний класс для обработки логики приложения, суммирующей все из них. Как правило, вы не хотите, чтобы ваша прикладная логика смешалась с вашей сетевой логикой.

Простой пример: (обратите внимание на использование 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() 

Вы также можете посмотреть на 'Writing Clients' docs on the Twisted site.