2013-02-06 20 views
0

我不明白如何連接關閉客戶端套接字。Asyncore TCP服務器,我不明白如何連接關閉客戶端套接字

import asyncore 
import socket 

class TCPClientHandle(asyncore.dispatcher): 
    def __init__(self, sock, server): 
     asyncore.dispatcher.__init__(self, sock) 
     self.server = server 

    ..... 

    def handle_close(self): 
     print 'Client: handle_close' 
     self.server.removeClient(self) 

class TCPServer(asyncore.dispatcher, dict): 
    def __init__(self, host='127.0.0.1', port=31337): 
     asyncore.dispatcher.__init__(self) 
     self.create_socket(socket.AF_INET, socket.SOCK_STREAM) 
     dict.__init__(self, {self.fileno(): self}) 
     self.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) 
     self.bind((host, port)) 
     self.listen(5) 

    def handle_accept(self): 
     print 'Server: handle_accept' 
     client, (host, port,) = self.accept() 

     print 'Новый клиент %s:%d' % (host, port,) 
     self[client.fileno()] = TCPClientHandle(client, self) 

    def removeClient(self, client): 
     print 'Server: removeClient' 
     del self[client.fileno()] 

def main(): 
    asyncore.loop(0.1, True, TCPServer('127.0.0.1')) 

if __name__ == '__main__': 
    main() 

如果我重寫TCPServer

def removeClient(self, client): 
    print 'Server: removeClient' 
    del self[client.fileno()] 
    client.close() 

removeClient方法我有錯誤socket.error: [Errno 9] Bad file descriptor

P.S對不起,我的英語


UPD: 骯髒的黑客

class TCPServer(asyncore.dispatcher, dict): 
    doDel = [] 
    .... 
    def handle_accept(self): 
     print 'Server: handle_accept' 
     client, (host, port,) = self.accept() 
     print 'Новый клиент %s:%d' % (host, port,) 
     self[client.fileno()] = TCPClientHandle(client, self) 
     if len(self.doDel) >= 5: 
      self.doDel.pop().close() 

    .... 

    def removeClient(self, client): 
     print 'Server: removeClient' 
     del self[client.fileno()] 
     self.doDel.insert(0, client) 

:)這是工作!

回答

1

沒錯。謝謝大家

class TCPClientHandle(asyncore.dispatcher_with_send): 
    def __init__(self, sock, server): 
     asyncore.dispatcher.__init__(self, sock) 
     self.server = server 

    ..... 

    def handle_close(self): 
     if self.server.removeClient(self): 
      self.close() 

class TCPServer(asyncore.dispatcher, dict): 
    ..... 
    def removeClient(self, client): 
     del self[client.fileno()] 
     return True 
相關問題