Определение адреса клиента в 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()

21 Авг 2019 в 06:34
221 +1
0
Ответы
1

В объекте TCPRequestHandler в методе handle, можно получить IP-адрес клиента, подключившегося к серверу, используя атрибут self.client_address. Метод handle будет вызываться для каждого нового подключения и в нем вы можете получить IP-адрес клиента и сохранить его в объект игрока.

Пример:

class TCPRequestHandlersocketserver.BaseRequestHandlersocketserver.BaseRequestHandlersocketserver.BaseRequestHandler:
def handleselfselfself:
encoding = "utf-8"
# IP-адрес клиента
ip = self.client_address000 # порт клиента
port = self.client_address111
#инфа что мы получили
data = self.request.recv102410241024 # Дальше мы обрабатываем данные, которые пришли
# В конструкторе нового процесса создаем объект игрока с сохранением IP-адреса
player = Playerid,name,ipid, name, ipid,name,ip list_of_player.appendplayerplayerplayer

Таким образом, вы сможете сохранить IP-адрес каждого нового клиента и использовать его для отправки сообщений.

20 Апр 2024 в 13:16
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Гарантированные бесплатные доработки в течение 1 года
Быстрое выполнение от 2 часов
Проверка работы на плагиат
Поможем написать учебную работу
Прямой эфир