【问题标题】:Python client server how UDP is supposed to work?Python客户端服务器UDP应该如何工作?
【发布时间】: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() 来实现超时来避免这种情况。

标签: python sockets udp


【解决方案1】:

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

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

这意味着您不需要一直“询问新人”。相反,客户端只需向服务器发送一个数据包,以便服务器知道将所有未来数据包发送到哪里。

但 TCP 和 UDP 之间还有其他重要区别:

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 动机是我想更快地尝试一些基于速度/实时的游戏。而且 TCP 拥塞正在造成很少的“延迟”,一小时内可能发生多达 10 次。
    • 你试过UDT吗?编辑:UDT 是一个链接,虽然在我的显示器上我看不清楚。
    • 这些 TCP 的“滞后”是您会丢失数据包而不是使用 UDP 的地方。
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 2020-06-22
      • 1970-01-01
      • 1970-01-01
      • 2018-10-07
      • 2012-01-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多