2011-12-16 131 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关闭了连接。而你的问题是你的线程在它关闭后尝试处理它。

我希望我帮助你,我的英语很差是不是太难理解(我是法国人)