Socket通信を行うAndroidアプリケーションの実装をしています。
Socket通信でサーバとなり、接続してくるクライアントから連続で固定長の画像データを受け取り、次々に画面を更新するようなアプリを考えているのですが、read関数で一度に受け取るサイズが小さく何度もfor文を繰り返して処理が遅くなってしまいます。
java
1 2 byte[] bitmapBuf = new byte[IMAGE_MAX_SIZE]; 3 int bufRest = IMAGE_MAX_SIZE; 4 Socket reciveSocket = null; 5 ServerSocket bitmapReciever = null; 6 7 bitmapReciever = new ServerSocket(); 8 bitmapReciever.bind(new InetSocketAddress(12344)); 9 reciveSocket = bitmapReciever.accept(); 10 int recieveSize = reciveSocket.getReceiveBufferSize(); 11 Log.d(TAG,String.format("recieveSize = %d", recieveSize)); 12 InputStream in = reciveSocket.getInputStream(); 13 OutputStream out = reciveSocket.getOutputStream(); 14 15 for(;;){ 16 int readedSize = 0; 17 18 int readedSize = in.read(bitmapBuf, BGR_IMAGE_MAX-bufRest, bufRest); 19 Log.d(TAG,String.format("read size %d", readedSize)); 20 if(readedSize == -1){ 21 break; 22 }else{ 23 bufRest -= readedSize; 24 if(bufRest == 0) { 25 sendImage(bitmapBuf); 26 bufRest = BGR_IMAGE_MAX; 27 Log.d(TAG,String.format("readed! Picture outputed.\n")); 28 } 29 } 30 } 31
Logには「read size 1386」といったように1000-2000バイト程度のreadを何度も繰り返した後に「readed! Picture outputed.」というLogが出ます。
デバッグモードでステップ実行するともっと大きなサイズで受け取るので性能限界のような気もしますが。
BufferSizeのLogは「recieveSize = 1048576」となっており十分受け取れるように見えます。
処理を高速化したいのですが、readで一度に受け取るサイズを大きくする方法、もしくは別のAPIで改善できないでしょうか?
ちなみにクライアント機は有線、Androidは無線で同一のルーターに接続しています。
261120バイト(固定長)の画像ファイルを連続で受け取っており、一つの画像ファイルを受け取るのにreadが約170回程度、画像(261120バイト)を受け取るのに2000ms強かかっております。測定にはSystem.currentTimeMillis()を使用しています。
測定したAndroidデバイスにはXperia Z Ultara(C6833)を使用しました。
HTC OneやGalaxy S6などでも結果は変わりません。