2011-12-16 128 views
1

在下一個檢查中,我在線程中處理了Socket服務器。在句柄函數中我們創建Thread並通過請求和client_ 地址。 當我們在線程的run-method中處理請求時,它只能接收數據,但是當我嘗試發送一個異常時,會引發異常([Errno 9]錯誤的文件描述符) 有什麼問題?Python處理線程中的Socketserver請求

import SocketServer 
import threading 


class MyServerThread(threading.Thread): 

    def __init__(self, channel, details): 
     self.channel = channel 
     self.details = details 
     threading.Thread.__init__(self) 

    def run(self): 
     print 'Received connection:', self.details[0] 
     self.channel.send('(Response)') 
     print 'Received:', self.channel.recv(1024) 
     self.channel.close() 
     print 'Closed connection:', self.details[0] 


class MyThreadedSocketServerHandler(SocketServer.BaseRequestHandler): 

    def handle(self): 
     thread1 = MyServerThread(self.request, self.client_address) 
     thread1.start() 

if __name__ == '__main__': 
    server = SocketServer.TCPServer(('localhost', 8888), MyThreadedSocketServerHandler) 
    server.serve_forever() 


#---Client to test--- 
import socket 

message = "(Request)" 

sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
try: 
    sock.connect(('localhost', 8888)) 
    sock.send(message) 
    data = sock.recv(1024) 
    print 'Sent:  %s' % message 
    print 'Received: %s' % data 
finally: 
    sock.close() 




#Working example without "join" 
import socket 
import threading 

class ClientThread(threading.Thread): 

    def __init__(self, channel, details): 
     self.channel = channel 
     self.details = details 
     threading.Thread.__init__(self) 

    def run(self): 
     print 'Received connection:', self.details[0] 
     self.channel.send('message') 
     print self.channel.recv(1024) 
     self.channel.close() 
     print 'Closed connection:', self.details[0] 

server = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
server.bind(('', 8888)) 
server.listen(5) 

while True: 
    channel, details = server.accept() 
    ClientThread(channel, details).start() 
+0

也許客戶端關閉的時候連接你試圖發送數據? – werewindle 2011-12-16 13:36:33

回答

1

我認爲你正在尋找ThreadingMixIn

from SocketServer import TCPServer, ThreadingMixIn 

class MyServerThread(ThreadingMixIn, TCPServer): pass 
0

您的問題是:

thread1.start() 

上面的代碼是在後臺立即返回,MyServerThread.run()運行。所以MyThreadedSocketServerHandler.handle()在MyServerThread.run()可以執行之前返回。在handle()函數返回後,self.request將會關閉,你的客戶端將不會得到任何東西。當執行MyServerThread.run()時,socket將關閉,self.request.send()將失敗。

所以加:

thread1.join() 

開始

+0

好的。它現在有效。但是爲什麼它在沒有連接的情況下在另一個示例中工作(我以不同的方式啓動了服務器)?看看更新的問題 – And1 2011-12-16 14:02:29

0

後,我覺得probleme是與你的線程處理接收到的數據,您的請求被關閉以前生產線可以用它做任何事情。

爲爲例,如果u爲您的客戶這個樣子的

def handle(self): 
     thread1 = MyServerThread(self.request, self.client_address) 
     thread1.start() 
     thread1.join() 

你沒有錯誤添加

thread1.join() 

其實在調用handle後,Handler關閉了連接。而你的問題是你的線程在它關閉後嘗試處理它。

我希望我幫助你,我的英語很差是不是太難理解(我是法國人)