【发布时间】:2014-08-17 14:54:52
【问题描述】:
我有一个客户端-服务器“蛇”游戏在 TCP 连接上运行得非常好,我想试试 UDP 方式。
我想知道它应该如何使用?我知道 UDP 是如何工作的,如何制作一个简单的 ECHO 示例,但我想知道如何执行以下操作:
例如使用 TCP,每个 TICK(1/15 秒)服务器向客户端发送新的 Snake 头部位置。
使用 UDP,我应该做这样的事情吗:
客户端:
client = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
serverAddr = (('localhost', PORT))
while 1:
client.sendto('askForNewHead', serverAddr)
msg, addrServer = client.recvfrom(1024)
game.addPosition(msg)
服务器端:
server = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
server.bind((HOST, PORT))
while 1:
data, addr = server.recvfrom(1024)
server.sendto(headPosition, addr)
所以这里客户端必须要求服务器获取新的头部位置,然后服务器发送答案。我设法使它以这种方式工作,但我不知道这是否是一种好方法。
客户端必须在我的 TCP 连接时向 udp 请求更新,这似乎很奇怪,客户端只需要等到他收到消息。
【问题讨论】:
-
除非你有防火墙之类的东西,在客户端和服务器之间有状态数据包转发规则,否则客户端不需要发送 UDP 数据包到服务器来从服务器获取 UDP 数据包。服务器。也就是说,除非有任何干预,否则流量是相互独立的。请注意(就像 TCP 一样)recvfrom() 默认情况下会阻塞,直到收到数据包为止;这可能与您的问题有关。您可以通过将套接字设置为非阻塞模式或使用 select() 来实现超时来避免这种情况。