2011-07-25 55 views
1

爲了好玩,我寫了一個帶有asynchat的最小IRC服務器。我正在嘗試清除一些基礎知識(我的具體問題遵循代碼)。我決定不在Twisted中使用任何東西,這樣我就可以實現更多自己。首先,我的代碼有:python asynchat:如何存儲個人連接的信息,以及如何知道客戶端何時斷開連接

import asyncore,asynchat 
import socket 

class Connection(asynchat.async_chat): 
    def __init__(self, server, sock, addr): 
     asynchat.async_chat.__init__(self, sock) 
     self.set_terminator('\n') 
     self.data = "" 
     print "client connecting:",addr 
     # do some IRC protocol initialization stuff here 

    def collect_incoming_data(self, data): 
     self.data = self.data + data 

    def found_terminator(self): 
     print self.data 
     self.data = '' 

class Server(asyncore.dispatcher): 
    def __init__(self, host, port): 
     asyncore.dispatcher.__init__(self) 
     self.create_socket(socket.AF_INET, socket.SOCK_STREAM) 
     self.bind((host, port)) 
     self.listen(5) 

    def handle_accept(self): 
     conn, addr = self.accept() 
     Connection(self, conn, addr) 

    def handle_close(self): 
     self.close() 

s = Server('127.0.0.1',5006) 
asyncore.loop() 

所以,在我看來,這段代碼的結構類似於一個扭曲的客戶工廠:Server類初始化一次,基本上實例Connection每一個客戶端連接的時間。第一個問題:通過將所有連接存儲在Server列表中的所有連接保持跟蹤所有連接的客戶端的最佳方式是?

此外,我不明白我是如何知道特定客戶端何時關閉與我的套接字的連接? Connection實現asynchat(並通過擴展asyncore),但在Connection類中添加handle_close()回調時,客戶端斷開連接時不會觸發。它似乎只適用於服務器上綁定的套接字被銷燬的時候。我沒有看到爲此目的的任何方法。無論客戶端是否連接,此套接字始終保持打開狀態,對嗎?

回答

0

處理客戶端關閉連接檢查handle_error方法,您的客戶端是否發出乾淨的關閉連接? handle_error():當引發異常並且沒有以其他方式處理時調用。默認版本打印濃縮回溯。

希望它有幫助。

相關問題