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

+0

В документации на http://docs.python.org/library/select.html#select.select вы можете видеть, что, что бы вы ни ожидали, нужно только предоставить член 'fileno'. Поэтому, если ваше соединение просто возьмет на себя этот метод из своего сокета, вы можете использовать его в 'select'-call. – filmor

+0

У меня возникли проблемы с визуализацией того, как это будет выглядеть. Не могли бы вы предоставить короткий фрагмент синтаксиса, чтобы помочь мне разобраться? – sadmicrowave