【问题标题】:SocketServer - how to identify clientsSocketServer - 如何识别客户端
【发布时间】:2016-05-06 09:19:15
【问题描述】:

我正在开发一个非常简单的服务器。该服务器应该能够执行clients 请求的一些预定义命令。

我想单独存储有关已连接客户端的信息。例如,我希望服务器添加一些特定的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,但我不知道应该在哪里创建这些对象。

【问题讨论】:

    标签: python sockets socketserver


    【解决方案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 的写入,但这是留给读者的练习。

    【讨论】:

    • 谢谢,self.client_address 正是我想要的。我正在本地计算机上对其进行测试,因此 client_address[0] 是所有客户端的本地主机,但 client_address 应该是唯一的。
    • @Milano 是的,只要客户端在请求之间保持连接,您就可以使用它。如果他们重新连接,他们可能会获得不同的端口。
    猜你喜欢
    • 2011-01-27
    • 2018-03-16
    • 2017-08-03
    • 2023-03-06
    • 1970-01-01
    • 1970-01-01
    • 2011-03-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多