我在blender游戏中编写了一个脚本,我使用套接字,我有一个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]
我想我没有达到异常,因为客户端的套接字仍处于打开状态,因此消息正确到达。
有没有人知道如何解决这个问题?
答案 0 :(得分:0)
客户端应发送有关退出游戏的一些信息,因此服务器确切知道何时关闭套接字。所以这个过程是由客户端触发的。
答案 1 :(得分:0)
我找到了一个解决方案:我不知道客户何时会退出游戏,所以我无法关闭他的插座,我所知道的是,当客户运行他的游戏时 - 他可以向服务器发送消息。所以只要服务器播出,他就会从客户端请求“连接”#34;信息。每次服务器没有从客户端收到消息时,他都会计算它。现在,在您确定客户端断开连接之前,您需要完成多少计数。
这是我的接收方式:
def receive(self):
while True:
for k in self.addr_connected:
if self.addr_connected[k] > 50:
self.Remove_Client(k)
break
try:
data, addr = self.socket.recvfrom(1024)
if not addr in self.addr_user:
user= User(data.decode())
scene = logic.getCurrentScene()
spawner = scene.objects['Spawner']
avatar = scene.addObject("Avatar", spawner)
avatar.children[0]['Text'] = user.name
avatar['user']= user
self.addr_user[addr] = user
self.addr_connected[addr] = 0
else:
user= self.addr_user[addr]
try:
user.keyboard.updateState(pickle.loads(data))
except:
data = data.decode()
if data == "I am connected":
self.addr_connected[addr] = 0
for k in self.addr_connected:
if k != addr:
self.addr_connected[k] += 1
except socket.error:
for k in self.addr_connected:
self.addr_connected[k] += 1
break