【发布时间】: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。