代码之家  ›  专栏  ›  技术社区  ›  trustin

非阻塞UDP I/O与爪哇中阻塞UDP I/O的比较

  •  14
  • trustin  · 技术社区  · 17 年前

    无阻塞TCP/IP SocketChannel S和 Selector 在NIO中,帮助我用少量线程处理许多TCP/IP连接。但是UDP呢 DatagramChannels ?(我必须承认我对UDP不太熟悉。)

    UDP发送操作似乎没有阻止,即使 DatagramChannel 不是在阻塞模式下工作。有没有真正的案例 DatagramSocket.send(DatagramPacket) 堵塞或类似情况?我真的很好奇是否存在这样的情况,以及在生产环境中可能存在的情况。

    如果 DatagramSocket.send(数据包) 实际上不会阻塞,我也不会使用连接的 DatagramSocket 并且只绑定到一个端口,是否没有使用非阻塞模式的优势 数据通道 选择器 ?

    3 回复  |  直到 8 年前
        1
  •  13
  •   James    17 年前

    我使用Java的DATAGAMSOCKET、频道等已经有一段时间了,但是我仍然可以给你一些帮助。

    UDP协议不像TCP那样建立连接。相反,它只是发送数据并忘记它。如果确保数据确实到达那里是很重要的,那么这是客户的责任。因此,即使您处于阻塞模式,发送操作也只会阻塞一段时间,只要将缓冲区清除就行。由于UDP对网络一无所知,因此它将在不检查网络速度的情况下尽早写出它,或者如果它真的到达了它应该去的地方。因此,对您来说,似乎通道实际上已经准备好进行更多的发送了。

        2
  •  8
  •   Peter Lawrey    17 年前

    UDP不阻塞(它只在将数据传输到操作系统时阻塞) 这意味着,如果下一个跃点/交换机/计算机在任何时候都不能缓冲UDP包,它就会将其丢弃。在某些情况下,这可能是可取的行为。但这是你需要注意的。

    UDP也不能保证

    • 按发送顺序发送数据包。
    • 不要拆散大包裹。
    • 通过交换机转发数据包。通常关闭交换机之间的UDP转发。

    但是,UDP支持多播,因此相同的数据包可以传递到一个或多个主机。但是,发送者不知道是否有人接收到数据包。

    UDP的一个棘手的问题是它大部分时间都能工作,但有时会以非常难以复制的方式出现严重故障。出于这个原因,即使您做了一些测试,并且它看起来工作正常,您也不应该假设可靠性。

        3
  •  0
  •   Andras Balázs Lajtha    13 年前

    非阻塞UDP在接收端最有用。 数据包发送只能由于本地情况而延迟:本地流量形成工具(如“游戏网卡”)将游戏流量优先于其他流量源,或者过载的网卡(不太可能发生)可能会延迟数据包的发送。一旦退出系统。一旦数据包离开本地接口,它就不再是应用程序的问题。