楽しいため、私は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()コールバックを追加することはできません。これは、サーバー上のバインドされたソケットが破棄されたときだけのようです。私はこの目的のための方法を見ません。このソケットは、クライアントが接続しているかどうかにかかわらず、常に開いたままです。