2011-07-25 3 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():例外が発生し、それ以外の場合は処理されないときに呼び出されます。デフォルトのバージョンでは、圧縮されたトレースバックが出力されます。

願っています。

関連する問題