2012-01-11 37 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

你肯定能找到某種方式來破解這,但你應該實施一個Connection類來處理一個客戶端連接和跟蹤的東西,如用戶名,例如

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

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

但我需要連接實例存儲這使我回到原點 – sadmicrowave 2012-01-11 16:51:14

+0

在文檔在http://docs.python.org/library/select.html#select.select插座你可以看到,無論你想等待什麼,只需要提供'fileno'成員。所以如果你的連接只是從它的套接字接管這個方法,你可以在'select'-call中使用它。 – filmor 2012-01-11 16:56:19

+0

我有問題可視化如何看起來。你能提供一小段語法來幫助我理解嗎? – sadmicrowave 2012-01-11 17:46:04