Я написал сценарий в игре блендера, и я использую сокеты, у меня есть Server.blend и client.blend.Закрытие сокета при завершении игры
это конструктор моего сервера:
class Server:
def __init__(self, host="127.0.0.1", port= 9238):
self.socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
self.socket.setblocking(False)
self.socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
self.socket.bind((host, port))
и это мой клиент:
class Client:
def __init__(self, server_ip="127.0.0.1", server_port= 9238):
self.socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
self.socket.setblocking(False)
self.serv_addr = (server_ip, server_port)
Проблема заключается в том, что я не знаю, когда клиент собирается выйти из игры, так Я не могу закрыть его сокет, что поддерживает открытый порт, поэтому я не могу использовать текущий порт снова.
У меня есть словарь, который содержит все адреса всех клиентов, поэтому я попытался отправить сообщение всем адресам, и в случае отсоединения клиента я не смогу отправить сообщение и использовать и исключение для удаления адреса из списка (и это аватар и т.д ..):
def Check_For_Disconnect(self):
for addr in self.addr_user:
try:
self.socket.sendto(b"You are connected!" , addr)
except socket.error:
scene = logic.getCurrentScene()
for obj in scene.objects:
if str(obj) == "Text" and obj == self.addr_user[addr].name:
obj.delete()
del self.addr_user[addr]
Я полагаю, что я не дотягиваю исключение, потому что сокет клиента остается открытым, так что сообщение поступает правильно.
Есть ли у кого-нибудь идеи, как я могу обойти эту проблему?
просьба сообщить код - как отслеживать действия пользователей и т.д., если вы не отслеживать его/ее деятельности, это очень трудно получить информацию, когда он/она покидает игру. – marmeladze
Не уверен, в чем вопрос. Когда клиент отключается, сообщается событие disconnet (я принимаю TCP). – SergeyA
В этом проблема. Я не использую TCP, я отредактировал свой вопрос и добавил код, так что теперь вы можете видеть, что я его не использую. – Maor2871