Определение адреса клиента в soketserver? Я пишу код сервера для игры в шашки. Тут у меня каждый раз для нового клиента создается новый процесс. Но т к в игре у нас сообщения отсылаются и в ответ на запрос игрока как ему так и его сопернику я решил в объекте игрок еще запоминать его адресс ip чтобы потом можно было отослать ему сообщения(если его соперник походит). Как нам в следующем коде при создании нового процесса с клиентом узнавать его ip-адрес?import pickle import socket import socketserver import threading import time class Player: def __init__(self, id, name, ip_adress): self.id = id self.name = name #состояние 1 - прошел авторизацию но еще не играет, состояние 2 - еще не играет и ждет появление партнера по игре, состояние 3 - в игре self.state=1 #игровой цвет - нужен для игры self.color=None self.ip=ip_adress #список всех авторизированных игроков list_of_player=[] #обработчик запросов class TCPRequestHandler(socketserver.BaseRequestHandler): def handle(self): encoding = "utf-8" #инфа что мы получили data = self.request.recv(1024) # Дальше мы обрабатываем данные, которые пришли class ThreadedTCPServer(socketserver.ThreadingMixIn, socketserver.TCPServer): pass if __name__ == "__main__": #адрес и порт нашего сервера HOST, PORT = "localhost", 80 server = ThreadedTCPServer((HOST, PORT), TCPRequestHandler) # ip, port = server.server_address server_thread = threading.Thread(target=server.serve_forever) server_thread.daemon = False server_thread.start() #чтобы сервер закрылся только при исключении, например прерывании с клавиатуры while True: try: time.sleep(1) except: break server.shutdown() server.server_close()
В объекте TCPRequestHandler в методе handle, можно получить IP-адрес клиента, подключившегося к серверу, используя атрибут self.client_address. Метод handle будет вызываться для каждого нового подключения и в нем вы можете получить IP-адрес клиента и сохранить его в объект игрока.
Пример:
class TCPRequestHandler(socketserver.BaseRequestHandler): def handle(self): encoding = "utf-8" # IP-адрес клиента ip = self.client_address[0] # порт клиента port = self.client_address[1] #инфа что мы получили data = self.request.recv(1024) # Дальше мы обрабатываем данные, которые пришли # В конструкторе нового процесса создаем объект игрока с сохранением IP-адреса player = Player(id, name, ip) list_of_player.append(player)
Таким образом, вы сможете сохранить IP-адрес каждого нового клиента и использовать его для отправки сообщений.
В объекте TCPRequestHandler в методе handle, можно получить IP-адрес клиента, подключившегося к серверу, используя атрибут self.client_address. Метод handle будет вызываться для каждого нового подключения и в нем вы можете получить IP-адрес клиента и сохранить его в объект игрока.
Пример:
class TCPRequestHandler(socketserver.BaseRequestHandler):def handle(self):
encoding = "utf-8"
# IP-адрес клиента
ip = self.client_address[0]
# порт клиента
port = self.client_address[1]
#инфа что мы получили
data = self.request.recv(1024)
# Дальше мы обрабатываем данные, которые пришли
# В конструкторе нового процесса создаем объект игрока с сохранением IP-адреса
player = Player(id, name, ip)
list_of_player.append(player)
Таким образом, вы сможете сохранить IP-адрес каждого нового клиента и использовать его для отправки сообщений.