游戏结束时关闭套接字

时间:2015-10-01 19:28:32

标签: python sockets blender

我在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]

我想我没有达到异常,因为客户端的套接字仍处于打开状态,因此消息正确到达。

有没有人知道如何解决这个问题?

2 个答案:

答案 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