2012-10-06 130 views
0

我想打3的SocketServer在一個Python程序多SocketServer的工作:蟒蛇:在同一時間

import threading 
import SimpleHTTPServer 
import SocketServer 

class PolicyHandler(SocketServer.BaseRequestHandler): 
    def handle(self): 
     self.data = self.request.recv(128).strip() 
     print self.data 
     if self.data == '<policy-file-request/>\0': 
      self.request.sendall('message 1') 


class LiveRequestHandler(SocketServer.BaseRequestHandler): 
    def handle(self): 
     self.request.sendall('message 2') 


def main(): 
    httpd = SocketServer.TCPServer(('',80),\ 
           SimpleHTTPServer.SimpleHTTPRequestHandler) 
    httpdThr = threading.Thread(target=httpd.serve_forever) 
    httpdThr.daemon = True 
    httpdThr.start() 

    liveServer = SocketServer.TCPServer(('',8090), LiveRequestHandler) 
    livThr = threading.Thread(target=liveServer.serve_forever) 
    livThr.daemon = True 
    livThr.start() 

    policyServer = SocketServer.TCPServer(('',834), PolicyHandler) 
    policyThr = threading.Thread(target=policyServer.serve_forever) 
    policyThr.daemon = True 
    policyThr.start() 

if __name__ == '__main__': 
    main() 

我運行它,下面的輸出:

Finding files... done. 
Importing test modules ... done. 

---------------------------------------------------------------------- 
Ran 0 tests in 0.000s 

OK 

很奇怪的是,它會立即退出該程序,所以我的客戶端程序不能連接到三個套接字服務器。如何防止它退出程序?

+0

有你'SocketServer'文檔中看到的[異步示例](http://docs.python.org/library/socketserver.html#asynchronous-mixins) ? –

+0

是的,我見過。它顯示了一個SocketServer異步處理多重請求。 –

+0

是的,但您可以使用相同的技術將'handle_forever'調用放入單獨的線程中。 –

回答

0

當沒有更多的非守護線程正在運行時,守護進程線程終止,因此它們在主結束時退出。添加的東西,以保持主運行,如:

raw_input('Press enter to stop servers.') 
+0

我已經解決了這個問題。謝謝。 –

0

如果你真的想從同一個程序啓動三臺服務器,那將是一個解決方案。

0

現在我改變我的代碼如下:

httpd = SocketServer.TCPServer(('',80), SimpleHTTPServer.SimpleHTTPRequestHandler) 
httpdThr = threading.Thread(target=httpd.serve_forever) 
httpdThr.daemon = True 
httpdThr.start() 

liveServer = SocketServer.TCPServer(('',8090), LiveRequestHandler) 
livThr = threading.Thread(target=liveServer.serve_forever) 
livThr.daemon = True 
livThr.start() 

policyServer = SocketServer.TCPServer(('',834), PolicyHandler) 
policyThr = threading.Thread(target=policyServer.serve_forever) 
policyThr.daemon = True 
policyThr.start() 

它做工精細。但現在我不知道如何在需要時向客戶發送消息。

+0

你應該修改你的問題,而不是添加更多的信息作爲答案。 –