2012-01-11 14 views
0

私はシンプルなpython telnetベースのチャットサーバーを持っていますが、これはユーザーがユーザー名を設定する機能がありません。完全なスクリプトは次の場所にあります。http://paste.pound-python.org/show/16076/変数をPythonのソケットに格納します

は基本的に私は自分のリスナーを作成します。

self.srvsock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
self.srvsock.bind(('', port)) 
self.srvsock.listen(5) 
self.descriptors = [ self.srvsock ] 

その後、私が接続しているユーザーとそのソケットを介してのサイクルにselect.selectを使用するには、送信:

def run(self): 
    while 1: 
     (sread, swrite, sexec) = select.select(self.descriptors, [], []) 
     for sock in sread: 
      if sock == self.srvsock: 
       self.accept_new_connection() 
      else: 
       str = sock.recv(6042) 
       host, port = sock.getpeername() 

       if str == '': 
        #stop user connect 
       elif '\username' in str: 
        self.set_username(str, sock, port) 
       else: 
        #send user string 

私の質問私が作成したself.set_usernameメソッドを使用しています。ユーザ名を設定してユーザソケット内に格納して参照する方法が必要です。私のset_username()メソッドは次のようになります:

def set_username(self, str, sock, port): 
    username = str[ str.find(' ')+1: ] 
    sock.append({'username': username}) #<!!!--obviously this does not work 
    str = "[user:%s] now known as %s" % (port, username) 
    sock.send(str) 
    self.broadcast_string(str) 

これをどのようにして正常に行うことができますか?

答えて

2

あなたは確かにこれをでハックするいくつかの方法を見つけることができますが、あなた例えば、1つのクライアント接続を処理し、ユーザー名のようなものを追跡Connectionクラスを実装する必要があります

class Connection(object): 
    def __init__(self, sock): 
     self.socket = sock 

    def fileno(self): 
     return self.socket.fileno() 
+0

が、その後、私はhttp://docs.python.org/library/select.html#select.selectでドキュメントでバック振り出し – sadmicrowave

+0

に私をもたらしソケットに接続インスタンスを格納する必要がありますあなたが待っていたいものがあれば、 'fileno'メンバーだけを提供すればよいことが分かります。だからあなたの接続がちょうどそのソケットからこのメソッドを引き継ぐなら、 'select'コールでそれを使うことができます。 – filmor

+0

これはどのように見えるかを視覚化する問題があります。私が理解するのに役立つ構文の短いスニペットを提供できますか? – sadmicrowave

関連する問題