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

时间:2014-08-17 14:54:53

标签: python sockets udp

我有一个客户端 - 服务器“蛇”游戏与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进行更新似乎很奇怪,客户端只需要等待,直到他收到消息。

3 个答案:

答案 0 :(得分:2)

TCP和UDP之间存在差异,但不是您描述的方式。与TCP一样,客户端可以从服务器获取消息,而无需每次都询问新数据。不同之处是:

  • 使用TCP,初始连接包括客户端和服务器之间的数据包交换。除非客户端套接字已绑定到IP和端口,否则它将绑定到客户端IP并将分配一个空闲端口。由于客户端和服务器之间的握手,服务器知道在哪里联系客户端,因此可以在不从客户端获取数据的情况下将数据发送到数据包。
  • 使用UDP时没有初始握手。除非已绑定,否则在将第一个数据包发送到服务器时,套接字将绑定到客户端IP和空闲端口。只有在收到此数据包时,服务器才会知道客户端的IP和端口,并且可以重新发送数据。

这意味着,您不需要问新的头等。每时每刻。相反,客户端必须只向服务器发送一个数据包,以便服务器知道将来所有数据包的发送位置。

但TCP和UDP之间还存在其他重要差异:

  • UDP数据包可能会丢失或以不同的顺序到达。使用TCP,您可以保证交付。
  • 使用UDP时,没有真正的连接,只有两个对等体之间的数据包交换。使用TCP,您可以获得连接的开始和结束。这与防火墙或路由器中的数据包筛选器相关,后者通常需要维护连接状态。由于UDP没有连接结束,因此数据包过滤器只使用简单的超时,通常低至30秒。因此,如果客户端位于家庭网络中并且被动地等待来自服务器的数据,则由于超时而导致数据包过滤器关闭状态,因此它可能会永远等待。要解决此问题,必须定期传输,以便状态不会超时。

人们常常发现这样的论点,即UDP比TCP更快。这是完全错误的。但是如果数据包丢失,您可能会看到延迟问题,因为TCP会发现数据包丢失并再次发送数据包,并且还会降低线速以减少数据包丢失。使用UDP,您必须自己处理数据包丢失和其他拥塞问题。有些情况比如实时音频,可以放松一些数据包但低延迟很重要。这些是UDP很好的情况,但在大多数其他情况下,TCP更好。

答案 1 :(得分:0)

UDP与TCP不同,我相信使用python,客户端必须要求服务器进行更新。 虽然通过互联网学习和使用不同的通信方式很有趣,但对于python我真的建议坚持使用TCP。

答案 2 :(得分:0)

您不必向服务器请求更新。但由于UDP是无连接的,因此服务器可以在不被询问的情况下发送头部位置。但客户端应该将i-m-alive-packets发送到服务器,但这可能每10秒左右发生一次。