сохранить переменную в сокет в Python - PullRequest
0 голосов
/ 11 января 2012

У меня есть простой чат-сервер на основе python telnet, которому не хватает функциональности, позволяющей пользователям устанавливать имена пользователей.Полный сценарий находится здесь: http://paste.pound -python.org / show / 16076 /

В основном я создаю свой слушатель:

 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 )

Как я могу сделать это успешно?

1 Ответ

2 голосов
/ 11 января 2012

Конечно, вы можете найти способ взломать это, но вы должны реализовать класс Connection, который обрабатывает одно клиентское соединение и отслеживает такие вещи, как имя пользователя, например,

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

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