繁体   English   中英

SocketServer-如何识别客户端

[英]SocketServer - how to identify clients

我正在一个非常简单的服务器上工作。 该服务器应该能够执行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 ,但是我不知道该在哪里创建该对象。

您可以使用处理程序的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的写入,但这是读者的一项工作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM