2016-01-28 78 views
0

我正在一个非常简单的服务器上工作。该服务器应该能够执行clients所要求的一些预定义的命令。SocketServer - 如何识别客户端

我想单独存储关于连接客户端的信息。例如,我想要服务器添加一些特定的请求。

下面是一个例子:

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属性标识客户,并跟踪请求在全球字典:

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]对于所有客户端都是localhost,但client_address应该是唯一的。 –

+0

@Milano是的,只要客户端在请求之间保持连接,您就可以使用它。如果他们重新连接,他们可能会得到一个不同的端口。 – glibdud