首页 > 解决方案 > 同一端口上的多个DatagramSocket,仅首先获得流量

问题描述

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

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

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

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

标签: javasocketsudp

解决方案


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

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

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


推荐阅读