2013-12-23 36 views
10

這個問題已解決。工作代碼也在這篇文章中給出。在Python中使用SocketServer框架創建多線程服務器

問題: 我目前越來越熟悉與Python的網絡編程。我目前正在使用SocketServer框架。現在我的問題是如何創建多線程服務器,可以接受多個使用SocketServer模塊的客戶端?我基本上試圖用這個代碼

t = Thread(target=server.serve_forever()) 
t.start() 

目前在我的程序中,服務器只接受一個客戶端。我使用netcat連接到服務器。第一個客戶端連接到服務器沒有任何問題。如果我嘗試從第二個客戶端連接到服務器,客戶端只是一直等待連接。一旦斷開第一個客戶端,第二個客戶端就會自動與服務器連接。在我看來,多線程不工作。我無法弄清楚我錯在哪裏。任何提示都會很棒。 我的代碼如下:

#!/usr/bin/env python 

import SocketServer 
from threading import Thread 


class service(SocketServer.BaseRequestHandler): 
    def handle(self): 
     data = 'dummy' 
     print "Client connected with ", self.client_address 
     while len(data): 
      data = self.request.recv(1024) 
      self.request.send(data) 

     print "Client exited" 
     self.request.close() 



server = SocketServer.TCPServer(('',1520), service) 
t = Thread(target=server.serve_forever()) 
t.start() 

感謝

更新: 下面的代碼解決方案:

#!/usr/bin/env python 


import SocketServer 
from threading import Thread 

class service(SocketServer.BaseRequestHandler): 
    def handle(self): 
     data = 'dummy' 
     print "Client connected with ", self.client_address 
     while len(data): 
      data = self.request.recv(1024) 
      self.request.send(data) 

     print "Client exited" 
     self.request.close() 


class ThreadedTCPServer(SocketServer.ThreadingMixIn, SocketServer.TCPServer): 
    pass 

t = ThreadedTCPServer(('',1520), service) 
t.serve_forever() 

回答

5

它比你更簡單的認爲:

class ThreadedTCPServer(SocketServer.ThreadingMixIn, SocketServer.TCPServer): 
    pass 

比你只需要使用新的ThreadedTCPServer而不是TCPServer

欲瞭解更多信息,你可以閱讀some doc

然而,在你的代碼中犯了一些錯誤:

  1. target參數必須是一個callable對象不是「已調用」對象。
  2. 要處理許多請求,您需要構建一個線程池。如果你只使用一個線程,如果它是主線程或「子」線程,則不會有任何區別。
+0

恩,謝謝。文檔中的示例對於像我這樣的新手來說很複雜。所以,我用你的想法,現在我的程序按預期工作。 –

-1

你不應該循環的

server = SocketServer.TCPServer(('',1520), service) 
t = Thread(target=server.serve_forever()) 
t.start() 

只是一個猜測..

1

好感謝@Faust的意見。下面給出的代碼現在按照預期工作。

#!/usr/bin/env python 

import SocketServer 
from threading import Thread 


class service(SocketServer.BaseRequestHandler): 
    def handle(self): 
     data = 'dummy' 
     print "Client connected with ", self.client_address 
     while len(data): 
      data = self.request.recv(1024) 
      self.request.send(data) 

     print "Client exited" 
     self.request.close() 


class ThreadedTCPServer(SocketServer.ThreadingMixIn, SocketServer.TCPServer): 
    pass 


server = ThreadedTCPServer(('',1520), service) 
server.serve_forever() 
+1

這行'thread.start_new_thread(server.serve_forever(),())'應該只是'server.serve_forever()'。 – smeso

+0

@Faust謝謝我編輯了代碼。 serve_forever()也可以工作。 –

相關問題