私の Android (2.3 以降) アプリケーションは、同時に TCP サーバーを実行している 100 (最大) の組み込みデバイスと TCP 通信する必要があります。
スマートフォン アプリは、100 以上の接続を同時に処理できるほど堅牢である必要があります。頻繁に情報を設定/取得する必要があります。そのため、ネットワーク モジュールについては、次のオプションを分析しました。
- 第 1の方法: スレッド マネージャー (
ThreadPoolExecutor
) を用意し、デバイスごとに接続します。- 考えられる問題: 100 のスレッドを作成することは現実的ではありません。
- 2 番目の選択肢: 各 fd を維持するために Java NIO セレクターを使用する。
- 問題: Java NIO が遅いようです。チェックするディスクリプタが多いほど、遅くなります。
while (mMainSelector.select(SELECTOR_TIMEOUT) { .... 選択されたキーを取得するもの .... SocketChannel socketChannel = channel.accept()
クライアントが接続を開始してから、上記のコードが最後の行 (channel.accept()) に到達するまで、約 1 ~ 3 秒かかります。
また、私のテストを確認するために、これをサポートするいくつかのブログを参照しました。
- 3 番目の選択肢:
epoll
: セレクターよりは優れていますが、Android ではすぐには利用できないと思います。Androidで使用したことのある人はいますか?epoll
Android用のlibevビルドはありますか?
速度を犠牲にすることなく、数百の同時接続を処理するのに最適な代替手段はありますか?