【发布时间】:2015-12-29 23:14:57
【问题描述】:
我在搅拌机游戏中编写了一个脚本并使用套接字,我有一个 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]
我想我没有遇到异常,因为客户端的套接字仍处于打开状态,因此消息正确到达。
有人知道我该如何解决这个问题吗?
【问题讨论】:
-
请提供一些代码 - 你如何跟踪用户的行为等等。如果你不跟踪他/她的活动,当他/她离开游戏时很难得到通知。跨度>
-
不确定问题是什么。当客户端断开连接时,会传递一个 disconnet 事件(我假设是 TCP)。
-
这是问题..我不使用 TCP,我已经编辑了我的问题并添加了一些代码,所以现在你可以看到我不使用它..