2014-09-10 1 views
2

두 개의 서로 다른 포트 50000과 20000을 통해 서버에 연결하고 있습니다. 하나 이상의 데이터를 쓰고 때로는 다른 데이터를 쓰고 각각 응답을 얻습니다. 어떻게하면 제대로 할 수 있을까요? 꼬인 ClientFactory 서브 클래스에서 참조를 만들어야합니까? 다음은 코드 샘플입니다.꼬인 상태로 클라이언트를 식별하는 방법은 무엇입니까?

import sys 
from twisted.internet import reactor 
from twisted.python import log 
from twisted.internet import defer 
from twisted.internet.protocol import Protocol, ClientFactory 

log.startLogging(sys.stdout) 


class PrimeClient(object): 
    """ 
    """ 
    def __init__(self): 
     """ 
     """ 
     self.factory = PrimeClientFactory() 

    def connect(self): 

     servers = [('192.168.110.14', 50000),('192.168.110.14', 20000)] 

     for host, port in servers:    
     reactor.connectTCP(host, port, self.factory) 



class PrimeProtocol(Protocol): 

    def __init__(self): 
     pass 

    def connectionMade(self): 
     print 'Connection made: {} {}'.format(self, self.factory) 

    def dataReceived(self, data): 
     print 'RCV: {}'.format(data) 

    def connectionLost(self, reason): 
     print 'Connection lost: {}'.format(reason) 



class PrimeClientFactory(ClientFactory): 
    """ 
    """ 
    protocol = PrimeProtocol 

    def __init__(self): 
     pass 

    def clientConnectionFailed(self, connector, reason): 
     print 'Connection failed: {} - {}'.format(connector, reason) 

    def startedConnecting(self, connector): 
     print 'Started connection: {}'.format(connector) 



def main(): 
    prime = PrimeClient() 

    prime.connect() 
    reactor.run() 

if __name__ == "__main__": 
    main() 

이렇게하면 서버에 두 개의 연결이 생성됩니다. 그렇다면 예를 들어 포트 50000으로 보내려면 연결을 식별 할 수 있습니까?

답변

1

연결을 보관할 글로벌 dict/list를 유지 관리하고 connectionMade()/connectionLost()에 연결을 추가/제거 할 수 있습니다. 편리함을

+0

나는 세계의,하지만 좋은 제안을 사용하지 않도록하기 위해 노력하고있어 (또한, ClientFactoryconnectTCP 당신은 정말 use the much newer "endpoints" API for clients instead.한다, 이렇게 다소 오래된 방법이다). ClientCreator를보고 어떻게 내 커뮤니케이션에 사용할 수 있을지 생각해 보겠습니다. 이러한 연결을 통해 데이터를 송수신하는 API는 어디에서 제공됩니까? 일반적으로이 꼬인 코드는 전송과 같은 기능을합니다 ... – kepurlaukis

+0

실제로 전역을 사용하지 마십시오. – Glyph

0

에 대한

아니면 사용할 수 있습니다 ClientCreator 이것은 트위스트에 대한 frequently asked question이다.

가장 간단한 해결책은 PrimeClientFactoryconnections 목록을 작성하고 PrimeProtocolconnectionLostconnectionMadeself.factory.connections.remove(self)self.factory.connections.append(self)을하는 것입니다.

+0

지금 당장이 게시물을 읽었습니다.) ... 첫 번째 연결이 "관리"포트이고 다른 포트가 "데이터 전송"포트이기 때문에 연결 목록을 사용하지 않는 주된 목적입니다. 그래서 나는 그것들을 사용하고 그들을 다르게 취급하는 (데이터 내용과 다르게) 더 명확한 방법이 필요합니다. 어쩌면 별도의 프로토콜과 공장이 필요 하겠지만 ... 중복되는 것 같아요. – kepurlaukis

관련 문제