python - 如何使用 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 坐标。
这在本地运行良好,我确实注意到一些延迟,我认为不应该因为它是本地的,而在互联网上它的速度较慢。
我究竟做错了什么?我还能做些什么更好?
提前致谢
解决方案
推荐阅读
- vbscript - 1024 VBSCRIPT 中的预期语句运行时错误
- php - 尽管第一个 elseif 语句首先为真,但所有 else if 都会被触发
- go - 在开发过程中如何构建一个包?
- python - Setting Foreign Keys with SQLAlchemy for FastAPI
- laravel - mdi 图标未显示/工作 Laravel 8/Vue 2/Vuetify
- sql - 获取每个唯一 id 列的最后更改值的第一次出现
- python-3.x - 从熊猫数据框中提取数据
- python - Python 类型感知文档字符串标准
- javascript - 我如何将我的图像对齐页面上的所有其他内容?
- sql - Oracle SQL 检查日期是否在今天和另一个日期之间