Python客户端服务器UDP应该如何工作?

0 投票
3 回答
1818 浏览
提问于 2025-04-18 17:34

我有一个客户端-服务器的“贪吃蛇”游戏,使用TCP连接运行得很好,现在我想试试用UDP来实现。

我想知道应该怎么用UDP?我知道UDP是怎么工作的,也会做一个简单的回显示例,但我想知道怎么做以下这些:

比如在TCP中,每当游戏更新(每1/15秒),服务器会把新的蛇头位置发给客户端。

那么在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)

在这里,客户端需要向服务器请求新的蛇头位置,然后服务器再发送答案。我这样做是能成功的,但我不确定这样做是否合适。

感觉有点奇怪,因为在UDP中客户端需要主动请求更新,而在TCP连接中,客户端只需要等着接收消息就行。

3 个回答

0

你不需要每次都去问服务器有没有更新。不过因为UDP这种协议是无连接的,服务器可以主动发送头部位置的信息,而不需要你去请求。不过客户端应该定期给服务器发送“我还活着”的信号,这个可以大约每10秒发送一次。

0

UDP和TCP是两种不同的网络协议。在使用Python时,客户端确实需要向服务器请求更新。虽然学习和使用不同的网络通信方式很有趣,但我建议在Python中还是使用TCP比较好。

2

TCP和UDP之间有一些区别,但不是你描述的那样。比如,使用TCP时,客户端可以通过recvfrom从服务器接收消息,而不需要每次都请求新数据。它们的区别主要有:

  • 使用TCP时,初始连接会在客户端和服务器之间进行数据包交换。除非客户端的套接字已经绑定了IP和端口,否则它会绑定到客户端的IP,并分配一个空闲端口。由于客户端和服务器之间有一个握手过程,服务器知道如何联系客户端,因此可以在没有先从客户端获取数据的情况下,直接向客户端发送数据。
  • 而UDP没有初始的握手过程。除非已经绑定,套接字在向服务器发送第一个数据包时,会绑定到客户端的IP和一个空闲端口。只有在接收到这个数据包后,服务器才知道客户端的IP和端口,并可以将数据发送回去。

这意味着,你不需要一直“askForNewHead”。客户端只需向服务器发送一个数据包,这样服务器就知道将来所有的数据包该发送到哪里。

不过,TCP和UDP之间还有其他重要的区别:

  • 使用UDP时,数据包可能会丢失,或者到达的顺序可能会不同。而TCP则保证数据会被送达。
  • UDP没有真正的连接,只有两个对等方之间的数据包交换。而TCP则有连接的开始和结束。这对于防火墙或路由器中的数据包过滤器很重要,因为它们通常需要维护连接的状态。由于UDP没有连接结束,数据包过滤器通常只会使用简单的超时机制,通常设置为30秒。因此,如果客户端在家庭网络内被动等待服务器的数据,可能会因为数据包过滤器关闭了状态而永远等待下去。为了避免这种情况,必须定期传输数据,以防状态超时。

人们常常说UDP比TCP快,这其实是错误的。但如果数据包丢失,可能会出现延迟问题,因为TCP会发现数据包丢失并重新发送,同时降低传输速度以减少丢包。而使用UDP时,你需要自己处理数据包丢失和其他拥堵问题。在一些实时音频的场景中,丢失一些数据包是可以接受的,但低延迟很重要。这些情况下UDP表现不错,但在大多数其他情况下,TCP更好。

撰写回答