用于IOT项目的多服务器通信的Java单客户端线程



我想创建一个用于TCP/IP通信的客户端线程。但是客户端线程应该能够同时与至少10000台服务器进行通信。由于我想与数百万台服务器(实际上是基于GPRS的现场设备(通信,启动数百万个客户端线程并进行管理并不是一个好的做法。我已经尝试过用NIOSelector来做这件事。但我发现这只适用于服务器线程。ThreadPoolExecutor我也试过。这也未能同时管理大量的连接。请给出一个很好的建议,在不启动太多线程的情况下管理大量服务器。

如果您需要使用纯Java执行网络I/O,您有三个选项:旧I/O、新I/O(nio(和新I/O 2(nio2(。旧的I/O使用阻塞调用,所以基本上每个连接需要一个线程。你不想那样做,所以你应该使用nio或nio2。实际上并没有限制选择器只能用于服务器,您可以将其用于客户端连接。

另外请注意,使用nio或nio2并不是世界上最容易的任务。考虑使用完全为您的用例创建的netty库:以帮助编写可扩展的网络应用程序。它也不是最容易使用的库,但我仍然推荐它,因为它为您实现了很多东西。还有很多netty的协议实现,所以很可能,你甚至不需要写那么多代码。

事实上,大多数网络示例都是关于服务器的,因为人们通常都是这样写的。但是,以同样的方式编写非阻塞网络客户端是完全可能的。

也许可以使用一些非阻塞的东西,比如Play框架(在后台使用Akka或Netty(或Vert.x来处理这些请求。他们使用将工作分派到自定义线程池以避免阻塞。

https://www.lightbend.com/blog/why-is-play-framework-so-fast

因为Play是非阻塞的,所以当网络速度较慢,但可以免费提供另一个HTTP请求,并且因为Play是无状态的,没有会话信息绑定到

这对Vert.x 来说几乎是一样的

也许还可以看看Erlang和Go(Go例程(,也可以看看UDP。在任何情况下,硬件(网络、RAM、SSD(最终都将成为瓶颈。正如这里的其他人和其他答案所说,Netty是图书馆的首选,或者使用它的东西可能会引起兴趣。

相关内容

最新更新