【问题标题】:Multiple DatagramSocket on same port, only first gets traffic同一端口上的多个DatagramSocket,仅首先获得流量
【发布时间】:2019-12-13 06:20:18
【问题描述】:

我创建了一个 java 服务器,它在特定端口上侦听 udp 数据包,它创建一个新线程,并在收到数据包时将新的数据报套接字绑定到该端口,因此如果它在该端口上收到 10 个数据包,它会创建 10 个线程新的套接字绑定到同一个端口。

问题是虽然创建了新的线程和套接字,但只有第一个创建的套接字接收所有流量,其他线程/套接字继续监听而没有得到任何流量。

单线程跟不上流量,一些数据包丢失

我正在使用地址 localhost 和 jmeter udp 插件对此进行测试

【问题讨论】:

  • 对于 tcp,我知道您不能将多个套接字绑定到一个端口。我怀疑 udp 在这方面有所不同。你确定你没有得到除第一个之外的所有 Sockets 的 BindException 吗?
  • @f1sh 我设置了reuseaddress true 以将它们绑定到同一个端口,没有抛出异常。还检查 getReuseAddress() 返回 true,因此它允许在我的系统上
  • 使用 UDP 时,您需要有一个套接字(在一个线程上)尽可能快地接收数据(以降低丢失数据报的风险)并将接收到的数据放入某个队列中以进行进一步处理(在其他线程)。
  • 如果你想要 TCP,使用 TCP。

标签: java sockets udp


【解决方案1】:

数据报套接字类似于服务器套接字;每个主机只有一个绑定实例。

UDP 在设计上是有损的(由于 nw 和慢速目标读取速度不够快),但是使用完美的应用程序,您可以期望本地主机上的 MB/s,甚至可能在 LAN 上,但在 WAN 上或使用有限的应用程序。

大多数 UDP 应用程序都会有一个快速侦听器,以避免溢出(没有 java 控制那里的缓冲区空间)和 COPY(不共享字节数组,小心)数据报到应用程序中的队列导致的操作系统级别损失随意调整深度,以及从此类队列中获取的工作线程池。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-10
    • 1970-01-01
    相关资源
    最近更新 更多