我的 Android(2.3 及更高版本)应用程序需要与 100 个(最多)同时运行 TCP 服务器的嵌入式设备进行 TCP 通信。
智能手机应用程序应该足够强大,可以同时处理 100 多个连接。它需要经常设置/获取信息。所以对于网络模块,我们分析了以下选项:
- 第一种选择:拥有一个线程管理器 (
ThreadPoolExecutor
) 并为每个设备建立连接。- 可能的问题:制作 100 的线程是不可行的。
- 第二种选择:使用 Java NIO 选择器来维护每个 fd。
- 问题:Java NIO 似乎很慢。您要求他们检查的描述符越多,他们的速度就越慢。
while (mMainSelector.select(SELECTOR_TIMEOUT) { .... 获取选定键的东西 .... SocketChannel socketChannel = channel.accept()
从客户端开始连接到上述代码到达最后一行(channel.accept())大约需要1-3秒。
另外,为了确认我的测试,我参考了一些支持这一点的博客。
- 第三种选择:
epoll
: 比选择器更好,但我想它在 Android 中并不容易获得。有人用过epoll
安卓吗?我们有针对 Android 的 libev 构建吗?
是否有任何其他替代方案最适合处理 100 个同时连接,而不影响速度?