首页 > 解决方案 > 如何使用 python 套接字 (udp) 传输实时数据

问题描述

我正在尝试使用 pygame 和套接字制作在线游戏。我是套接字新手,所以遇到了一些麻烦。

目前,每个玩家只是一个正方形,可以根据命令在屏幕上移动。所以每个玩家都应该能够实时看到其他玩家的确切位置。

到目前为止,我想出的是:

#server.py
class Play:
    sk = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    sk.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
    #sk.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, 1)

    def __init__(self):
        #players positions
        self.x, self.y = 200, 400
        self.j, self.k = 400, 200
        #wait for client
        self.sk.bind(('', 12345))
        data, self.adr = self.sk.recvfrom(1024)
        #self.sk.setblocking(0)
        self.sk.settimeout(0.05)
        re_th = threading.Thread(target=self.receive)
        re_th.daemon = True
        re_th.start()
        self.run()

运行功能:

def run(self):
    win = pygame.display.set_mode((width, height))
    clock = pygame.time.Clock()
    while True:
        keys = pygame.key.get_pressed()

        if keys[pygame.K_LEFT] and self.x > 0:
            self.x -= vel
        if keys[pygame.K_RIGHT] and self.x < width - cw:
            self.x += vel
        if keys[pygame.K_UP] and self.y > 0:
            self.y -= vel
        if keys[pygame.K_DOWN] and self.y < height - ch:
            self.y += vel

        self.send()
        #draws on screen both player's squares
        clock.tick(60)

发送和接收功能:

def send(self):
    co = json.dumps((self.x, self.y))
    self.sk.sendto(co.encode('utf-8'), self.adr)

def receive(self):
    while True:
        try:
            data, xadr = self.sk.recvfrom(1024)
            self.j, self.k = (json.loads(data.decode('utf-8')))
        except OSError:
                pass

客户端文件非常相似。

run 函数接受用户输入来移动方块,将坐标发送给另一个玩家,然后在屏幕上绘制两个玩家。一个线程同时接收其他玩家的 x 和 y 坐标。

这在本地运行良好,我确实注意到一些延迟,我认为不应该因为它是本地的,而在互联网上它的速度较慢。

我究竟做错了什么?我还能做些什么更好?

提前致谢

标签: pythonpython-3.xsocketspython-sockets

解决方案


推荐阅读