Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/359.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java UDP服务器的实现方法?_Java_Multithreading_Udp_Nio_Netty - Fatal编程技术网

Java UDP服务器的实现方法?

Java UDP服务器的实现方法?,java,multithreading,udp,nio,netty,Java,Multithreading,Udp,Nio,Netty,我是JavaNIO新手 我有一个java程序,它在一个循环中迭代地查询不同IP/端口的服务器。 但是现在我想一次发送所有数据包,而不是循环发送,然后将接收到的数据存储在应答数据包中 查询只包含1个回复数据包,不需要进一步通信 是这样做的吗-> 创建一个数据报通道, 通过发送发送所有数据包, 侦听数据包并启动新线程来处理和存储数据包数据 服务器数量可能>400。 制作400个线程或400个数据报通道更好吗??? 我还应该使用异步包而不是NIO 使用Netty等会更容易吗?我不太熟悉NIO,但关于回

我是JavaNIO新手

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

查询只包含1个回复数据包,不需要进一步通信

是这样做的吗-> 创建一个数据报通道, 通过发送发送所有数据包, 侦听数据包并启动新线程来处理和存储数据包数据

服务器数量可能>400。 制作400个线程或400个数据报通道更好吗??? 我还应该使用异步包而不是NIO


使用Netty等会更容易吗?

我不太熟悉NIO,但关于回复处理,最好使用线程池和通道池

编辑-更多解释

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

因此,如果您有比可用线程更多的reply=tasks,那么这些任务将在队列中等待。Java在包下有很好的线程池支持。这些限制当然是可配置的


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

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


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

我会首先让普通NIO工作。值得注意的是,虽然TCP是可靠的,但UDP不是。你必须考虑到一些包裹可能没有到达。对于400个TCP连接,我仍然会使用一个线程,除非有充分的理由这样做。服务器只回复UDP。丢失的数据包不是问题。如果我用50个线程创建一个线程池,收到的回复数据包是51个。额外的数据包会发生什么情况?@解决方案当一个线程可以接收51个数据包时,为什么您有50个线程?如果一个数据包被接收,而该线程仍在处理前一个数据包,会发生什么情况?yair,使用threadpool并不像您建议的那么简单。很难想象为什么要同时处理所有数据包——这意味着数据包之间或它们的发送顺序之间没有连接。java中的标准执行器可能是一个错误的想法。我的经验法则是同步/在线处理来自同一来源的所有消息/数据包等。@bestsss好吧,发送订单似乎没有什么意义。回复之间的任何其他逻辑连接都可以在不同于侦听线程的线程中处理。底线-IO处理和业务逻辑应该分开。指定的线程是工人。工作队列是它们之间的交接。是否有任何现有的库/开源代码在java中处理多个并发数据包。任何示例代码都可以。谢谢。您要列出多少个网络适配器?如果您有1GB的连接,并且数据包大小为1KB,那么它们之间的距离不会超过10微秒。除非发送速度接近100K/s,否则它们看起来几乎是随机发送的。receive方法在数据报通道中工作多长时间?例如,如果我发送一个数据包。发送并放置一个断点…等待一段时间。。。我仍然可以使用.receive successfully.Thank.UDP数据包吗?路由器和操作系统中有一些队列。当这些队列填满时,数据包被悄悄地丢弃。我建议你试着调试你的应用程序,看看会发生什么;