爲了好玩,我寫了一個帶有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()回調時,客戶端斷開連接時不會觸發。它似乎只適用於服務器上綁定的套接字被銷燬的時候。我沒有看到爲此目的的任何方法。無論客戶端是否連接,此套接字始終保持打開狀態,對嗎?