Twisted를 사용하여 TCP Server와 Client를 한번에

Twisted에서 제공하는 TAC를 사용하면, 여러개의 서비스를 동시에 묶어 application service로 등록 사용할 수 있다.

앞서 만들었던 TestClient에 추가적으로 Server의 요소를 넣고자 한다.
예를 들면, Administrator의 목적으로.

이를 위해, 몇몇 패키지를 import 한다.

from twisted.internet.protocol import ServerFactory
from twisted.application import internet, service


추가적으로 서버의 프로토콜과 팩토리를 정의한다.
class AdminProtocol(LineReceiver):
    delimiter = '\n';
    
    def lineReceived(self, line):
        print line
        
    def connectionMade(self):
        print '$NEW CLIENT : %d clients are connected' % self.factory.numProtocols
        if self.factory.numProtocols > 100:
            self.transport.write("Too many connections, try later")
            self.transport.loseConnection()
            
    def connectionLost(self, reason):
        self.factory.numProtocols = self.factory.numProtocols - 1       
        print '$CONNECTION LOST : %d clients are remained' % self.factory.numProtocols
        
    def startedConnecting(self, connector):
        print '$started connecting..'

class AdminFactory(ServerFactory):
    protocol = AdminProtocol
   
    numProtocols = 0
    ID = 0
   
    def __init__(self):
        print 'initialized'

Service로 등록하기 위해,
service.Service를 상속받아  각각  ServerFactory와 ClientFactory를 리턴하도록 구현한다. 

class AdminService(service.Service):
    def getTestFactory(self):
        f = TestFactory()
        f.protocol = TestClient
        return f
   
    def getAdminFactory(self):
        f = AdminFactory()
        f.protocol = AdminProtocol
        return f

애플리케이션 서버로 묶어 주기 위해, 다음과 같이 등록한다.

application = service.Application('test', uid=1, gid=1)
f = AdminService()
serviceCollection = service.IServiceCollection(application)
internet.TCPServer(8002, f.getAdminFactory()).setServiceParent(serviceCollection)
internet.TCPClient('localhost', 8001, f.getTestFactory()).setServiceParent(serviceCollection)

이와 같이 작성한 파이썬 파일을 tac 파일로 변경하면, twisted application으로 실행할 수 있게 되는데, 이대 twistd 명령어로 실행시켜야 한다.

twistd -ny finger.tac   #just like before
twisted -y finger.tac   # daemonize, keep pid in twistd.pid


댓글

Designed by JB FACTORY