0

我是 Java NIO 的新手。

我有一个 java 程序,它在循环中迭代地查询服务器(不同的 IP/端口)。但是现在我想一次发送所有数据包而不是循环发送,然后将接收到的数据存储在回复数据包中。

查询仅包含 1 个回复数据包,无需进一步通信。

这是这样做的方法吗 - >制作一个数据报通道,通过 .send() 发送所有数据包,监听数据包并启动新线程来处理和存储数据包数据。

服务器数量可能 >400 。是做 400 个线程还是 400 个数据报通道更好???我也应该使用 async 包而不是 NIO 。

使用 Netty 等会更容易吗?

4

2 回答 2

0

我对 NIO 的建议还不够熟悉,但关于回复处理 - 最好使用线程池和通道池。

编辑 - 更多解释

您应该只有一个线程来侦听服务器回复的端口。收到回复后,将“处理任务”提交到任务队列。下一个可用线程将拉取该任务并处理它。

因此,如果您的回复(=任务)多于可用线程,则任务将在队列中等待。Java 在java.util.concurrent包下有很好的线程池支持。这些限制当然是可配置的。

基本上,listner 线程正在执行创建句柄任务和放入队列的最小操作。如果您害怕在短时间内丢失回复,那么您应该配置更多的侦听器线程......但我怀疑那里存在真正的问题。

于 2012-06-14T14:34:56.793 回答
0

如果您打算使用 UDP,您可以为每个服务器使用一个线程,并为所有服务器使用一个端口。您可能希望为不同的消息类型使用几个端口。

如果您只使用一个多播和端口,则任何侦听器都会听到从任何应用程序到该 IP 和端口的所有数据包。

于 2012-06-14T14:45:39.777 回答