java - 同一端口上的多个DatagramSocket,仅首先获得流量
问题描述
我创建了一个 java 服务器,它在特定端口上侦听 udp 数据包,它创建一个新线程,并在收到数据包时将新的数据报套接字绑定到该端口,因此如果它在该端口上获得 10 个数据包,它会创建 10 个带有新套接字的线程绑定到同一个端口。
问题是虽然创建了新的线程和套接字,但只有第一个创建的套接字接收所有流量,其他线程/套接字继续监听而没有任何流量。
单线程跟不上流量,一些数据包丢失
我使用地址 localhost 和 jmeter udp 插件对此进行测试
解决方案
数据报套接字类似于服务器套接字;每个主机只有一个绑定实例。
UDP 在设计上是有损的(由于 nw 和缓慢的目标读取速度不够快),但是使用完美的应用程序,您可以期望本地主机上的 MB/s,甚至可能在 LAN 上,但在 WAN 上或使用有限的应用程序时不会那么快。
大多数 UDP 应用程序将有一个快速侦听器,以避免溢出(没有 java 控制那里的缓冲区空间)和 COPY(不共享字节数组,小心)数据报到应用程序中的队列,可以调整深度随意,以及从此类队列中获取的工作线程池。
推荐阅读
- reactjs - 一次只打开一个部分的逻辑
- talend - 什么组件可用于使用 Talend 复制 excel 文件的每一行?
- discord.js - 如何检查消息中是否有文件并将其发送到另一个频道?[不和谐.js]
- android - 在 Play 商店中上传新的应用程序包或 apk 时出现问题
- sql - SQL Server FOR JSON PATH,如果为 null,则排除特定字段
- ckeditor - 使用 Docx4j 将 .docx 转换为没有 CSS 的 Html
- sql - SQL CTE 与视图
- g++ - 当 fPIC 已经使用时,在创建共享对象时不能使用重定位 R_X86_64_PC32 对符号
- kotlin - Kotlin REPL 算术
- ios - 在 XCode 的 Copy Files Build Phase 中保留目录结构