Python上的客户端/服务器

时间:2019-11-15 15:54:44

标签: python-3.x sockets pygame

我正在尝试编写具有多人游戏的游戏。游戏逻辑构建良好,但客户端/服务器部分不起作用。我不知道哪里是错误或错误的代码。

因此,我有一个服务器部分,它使用UPD将数据包发送到客户端(在这里使用UPD是个好主意吗?或者在这种情况下使用TCP更好?)并处理游戏会话。我决定在服务器上管理游戏对象,并仅将有关它们的信息发送给客户端。服务器部分运作良好。

我得到了客户的支持。这是代码:

class Client:
    def __init__(self,port):
        self.socket=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
        self.socket.bind(("localhost",port))

        self.server_data=[]

    def listen_socket(self):
        while True:
            data=self.socket.recvfrom(1024)
            print(data)
            self.server_data.append([json.loads(data[0].decode("utf-8"))])

    def get_data_from_queque(self):
        if len(self.server_data)>0:
            return self.server_data.pop(0)
        return []

    def send_data(self,data):
        self.socket.sendto(json.dumps(data).encode("utf-8"),self.server)

在游戏周期中,我处理新的数据包,并使用从数据包中获取的信息来更新精灵的位置。 这是游戏代码的一部分:

class Multiplayer(Game):
    def __init__(self,scr,port):
        super().__init__(scr)

        self.client=Client(port)

        Thread(target=self.client.listen_socket,daemon=True).start()
    def game_cycle(self):
        keys=pygame.key.get_pressed()
        if keys[pygame.K_LEFT]: self.client.send_data("LEFT")
        elif keys[pygame.K_RIGHT]:self.client.send_data("RIGHT")

        for data in self.client.get_data_from_queque():
            if data:
                self.ball.rect.x,self.ball.rect.y,self.ball.dx,self.ball.dy=data["BALL"][0],data["BALL"][1],data["BALL"][2],data["BALL"][3]
                self.ball_platform_1.rect.x,self.ball_platform_1.rect.y=data["PLATFORM1"][0],data["PLATFORM1"][1]
                self.ball_platform_2.rect.x,self.ball_platform_2.rect.y=data["PLATFORM2"][0],data["PLATFORM2"][1]
                self.score_1=data["SCORE1"]
                self.score_2=data["SCORE2"]
                self.game_status=data["GAME_STATUS"]

        self.output_text("Score: {}".format(self.score_1),(20,30),(255,0,0))

        self.ball.draw()
        self.ball_platform_1.draw()
        self.ball_platform_2.draw()

当我尝试运行此代码时,什么都没有发生。当游戏开始时,我按了一些按键显示更新,但是如果不按按键就不会更新。问题出在哪里?

0 个答案:

没有答案
相关问题