2016-01-28 2 views
0

Я работаю на очень простом сервере. Этот сервер должен иметь возможность выполнять некоторые предопределенные команды, запрошенные clients.SocketServer - как идентифицировать клиентов

Я хотел бы хранить информацию о подключенных клиентах отдельно. Например, я хочу, чтобы сервер добавлял несколько конкретных запросов clients.

Вот пример:

SERVER 
CLIENT1 
CLIENT2 

CLIENT1> print 'stuff' 
SERVER>> REQUESTS: 1 OUTPUT: stuff 
CLIENT2> print 'simple sentence' 
SERVER>> REQUESTS: 1 OUTPUT: simple sentence 
CLIENT> print 'hilarious' 
SERVER>> REQUESTS: 2 OUTPUT: hilarious 

Мой код прост:

class ThreadedTCPServer(SocketServer.ThreadingMixIn, SocketServer.TCPServer): 
    daemon_threads = True 

class ThreadedTCPRequestHandler(SocketServer.BaseRequestHandler): 
    def handle(self): 
     data = self.request.recv(1024) 
     command = data.split(' ')[0] 
     arguments = data.split(' ')[1:] 
     cur_thread = threading.current_thread() 

     output = do_command(command,arguments) 
     response = "{}: {}".format(cur_thread.name, output) 
     self.request.sendall(response) 


if __name__ == "__main__": 
    commands.register_commands() 
    HOST, PORT = _host, int(_port) 

    server = ThreadedTCPServer((HOST, PORT), ThreadedTCPRequestHandler) 
    ip, port = server.server_address 

    # start server 
    print "Running on: %s:%s" % (HOST, PORT) 
    server.serve_forever() 

Так что я хочу знать, как я мог бы хранить информацию о каждом клиенте. Я собирался создать класс Client и сделать object после каждого соединения, но я не знаю, где я должен создавать эти объекты.

ответ

1

Вы можете использовать client_address свойства обработчика для идентификации клиентов, а также отслеживать запросы в глобальном Dict:

from collections import defaultdict 

client_requests = defaultdict(int) 

class ThreadedTCPRequestHandler(SocketServer.BaseRequestHandler): 
    def handle(self): 
     ... 
     client_requests[self.client_address[0]] += 1 
     response = "{} ({}): {}".format(cur_thread.name, client_requests[self.client_address[0]], output) 

Обратите внимание, что поскольку вы используете резьбовой сервер, вам, вероятно, нужно добавить некоторый код блокировки для защиты записей до client_requests, но это упражнение осталось читателю.

+0

Спасибо, self.client_address был именно тем, что я искал. Я тестирую его на своем локальном компьютере, поэтому client_address [0] является локальным хостом для всех клиентов, но client_address должен быть уникальным. –

+0

@Milano Да, вы можете использовать это, если клиенты остаются связанными между запросами. Если они снова подключится, они, вероятно, получат другой порт. – glibdud

Смежные вопросы