[英]SocketServer - how to identify clients
I'm working on a very simple server. 我正在一个非常简单的服务器上工作。 This server should be able to do some predefined commands requested by
clients
. 该服务器应该能够执行
clients
请求的一些预定义命令。
I would like to store information about connected clients separately. 我想分别存储有关连接的客户端的信息。 For example, I want server to add a number of the particular
clients
requests. 例如,我希望服务器添加一些特定的
clients
请求。
Here is an example: 这是一个例子:
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
My code is simple: 我的代码很简单:
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()
So the thing I want to know is how could I store information about each client. 因此,我想知道的是如何存储有关每个客户端的信息。 I was considering to create a class
Client
and make an object
after each connection but I don't know where should I create this objects. 我当时正在考虑创建一个
Client
类,并在每次连接后创建一个object
,但是我不知道该在哪里创建该对象。
You could use the client_address
property of the handler to identify clients, and track requests in a global dict: 您可以使用处理程序的
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)
Note that since you're using a threaded server, you'll probably need to add some locking code to protect the writes to client_requests
, but that's an exercise left to the reader. 请注意,由于您使用的是线程服务器,因此可能需要添加一些锁定代码来保护对
client_requests
的写入,但这是读者的一项工作。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.