[英]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.