2013-10-06 22 views
3

我有一个困扰了我很长一段时间的问题,目前我正在从事一个外部操作请求的守护进程。它就像一个服务器客户端。在这个项目中,我使用了扭曲的Python框架,并且我成功地构建了一个非多线程服务器,它的工作原理!但现在,我需要一次为多个客户提供服务。我不知道如何在Twisted Framework中做到这一点。我尝试了所有我知道的...我该怎么做一个多线程扭曲python

请帮我这个:

class Server(protocol.Protocol, protocol.Factory): 

def buildProtocol(self, addr):        
    if addr.host in ipList: 
     log.msg("Connected from IP: " + addr.host) 
     return self 
    return None 

def dataReceived(self, data): 
    reactor.callFromThread(self.actionCreator(data)) 

def actionCreator(self, data): 
    jsonData = json.loads(data) 
    if not jsonData["action"]: 
     log.msg("Incorrect data from IP: " + self.transport.getPeer().host + " data: " + data) 
     self.transport.write(json.dumps({'response' : '300'})) 
    elif jsonData["action"] == 'echo': 
     log.msg("Doing ask from IP: " + self.transport.getPeer().host) 
     self.transport.write(json.dumps({'response' : '400', 'data' : {'status' : 'online'}})) 
    elif jsonData["action"] == 'wget': 
     log.msg("Downloading file... for user - " + jsonData["user"]) 
     os.system("wget -q http://****************") 
     self.transport.write(json.dumps({'response' : '400', 'data' : {'status' : 'downloaded'}})) 
    else: 
     log.msg("Incorrect data from IP: " + self.transport.getPeer().host + " data: " + data) 
     self.transport.write(json.dumps({'response' : '300'})) 


if __name__ == '__main__': 
    try: 
     log.msg("Running server...") 
     context = ssl.DefaultOpenSSLContextFactory(certificate + "/server.key", certificate + "/server.crt") 
     log.msg("Initiating a secure SSL connection...") 
     reactor.listenSSL(config.getint(general, 'port'), Server(), context) 
     log.msg("Waiting for connections...") 

     reactor.run() 
    except KeyboardInterrupt: 
     sys.exit() 

回答

1

默认情况下,您的服务器处理并发客户端 - 没有线程 - 作为编程模型的属性,后面是Twisted。

我没有看到任何在你的示例代码中使这个失效 - 如果你删除(破坏)尝试使用线程,这个服务器应该没有任何问题服务于多个客户端。

+0

所以我不需要其他任何东西来同时处理多个客户端? – Tesly

+1

如果你这样做,从这个示例代码中看不出来。 :) –

+0

那么你可以给我例子,我怎样才能同时处理多个客户?我知道如何在Python中执行此操作,而不是在Twisted中执行此操作。 – Tesly