Blender Multiplayer - трансляция клиента на сервер - PullRequest
0 голосов
/ 08 мая 2019

В настоящее время у меня на стороне клиента IP-адрес сервера жестко закодирован, но я хочу, чтобы клиентская часть получала IP-адрес от сервера с помощью широковещательной рассылки (или другим способом).В качестве информации у меня есть следующие вещи:

Сервер / Клиент: UDP-порт: Необходимо заполнить вручную

Я уже пытался добавить пример кода, но это не сработалоиз других ответов StackOverflow.

Это серверная часть:

class Server:
    ip = socket.gethostbyname(socket.gethostname())
    def __init__(self,host = ip, port=11155):
        self.socket = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
        self.socket.setblocking(False)
        self.socket.bind((host,port))

        self.addr_user = {}

    def receive(self):
        while True:
            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
                else:
                    user = self.addr_user[addr]
                    data = pickle.loads(data)
                    user.keyboard.updateState(data[0])
                    user.mousePosition.updateMousePosition(data[1])


            except socket.error:
                break

Это клиентская часть:

class Client:
    def __init__(self,server_ip ="IPOFSERVER GOES HERE", server_port=11155):
        self.socket = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
        self.socket.setblocking(False)


        self.serv_addr = (server_ip,server_port)

        self.entities = {}

        self.main = self.state_sendName

def receive(self):
        while True:
            try:
                data, addr = self.socket.recvfrom(1024)

                state = pickle.loads(data)

                for k in state:

                    if not k in self.entities:

                        scene = logic.getCurrentScene()
                        spawner = scene.objects["Spawner"]
                        entity = scene.addObject(k[0], spawner)
                        entity.children[0]["Text"] = k[1]
                        self.entities[k] = entity
                    else:
                        entity = self.entities[k]

                    entity.worldPosition = Vector(state[k][0])
                    entity.worldOrientation = Vector(state[k][1])
                    getChildren(entity).worldOrientation = Vector(state[k][2])




            except socket.error:
                break

Я ожидаю, что если клиент получитЗапущенный процесс «Matchmaking» будет запущен путем отправки широковещательного пакета, чтобы сообщить, что «клиент» ищет сервер.Когда сервер получает пакет клиента, сервер должен ответить своим IP-адресом, чтобы его можно было добавить и установить соединение!

...