socketで画像を転送するプログラムを作成しています。
以前の質問にて実装できたと思っていたのですが、一度きりの送受信しかできないことが発覚しました。複数回送受信するにはどうすればよいのでしょうか...以下に作成したプログラムの一部を示します。
ChatManager
1public class ChatManager implements Runnable{ 2 private Socket socket = null; 3 private Handler handler; 4 byte[] pvbyte = null;//受信したプレビュー画像 5 6 public ChatManager(Socket socket, Handler handler) { 7 this.socket = socket; 8 this.handler = handler; 9 } 10 11 private InputStream iStream; 12 private OutputStream oStream; 13 ByteArrayOutputStream bospv; 14 InputStream is; 15 private static final String TAG = "ChatHandler"; 16 17 @Override 18 public void run() { 19 try { 20 21 iStream = socket.getInputStream(); 22 oStream = socket.getOutputStream(); 23 24 handler.obtainMessage(WiFiServiceDiscoveryActivity.MY_HANDLE, this).sendToTarget(); 25 26 bospv = new ByteArrayOutputStream(); 27 copyFile(iStream, bospv);//受信データをbospvにコピー 28 pvbyte = bospv.toByteArray(); 29 handler.obtainMessage(WiFiServiceDiscoveryActivity.MESSAGE_READ, pvbyte).sendToTarget();//結果をアクティビティへ 30 31 } catch (IOException e) { 32 e.printStackTrace(); 33 } finally { 34 try { 35 socket.close(); 36 } catch (IOException e) { 37 e.printStackTrace(); 38 } 39 } 40 } 41 42 public void write(byte[] buffer) { 43 is = new ByteArrayInputStream(buffer); 44 copyFile(is,oStream); 45 } 46 public static boolean copyFile(InputStream inputStream, OutputStream out) { 47 byte buf[] = new byte[1024]; 48 int len; 49 try { 50 while ((len = inputStream.read(buf)) != -1) { 51 out.write(buf, 0, len); 52 53 } 54 out.flush(); 55 out.close(); 56 inputStream.close(); 57 } catch (IOException e) { 58 Log.d("debug", e.toString()); 59 return false; 60 } 61 return true; 62 } 63}
また、参考にした公式サンプルのソースは下記の通りです。
ChatManagerOrigin
1public class ChatManager implements Runnable { 2 3 private Socket socket = null; 4 private Handler handler; 5 6 public ChatManager(Socket socket, Handler handler) { 7 this.socket = socket; 8 this.handler = handler; 9 } 10 11 private InputStream iStream; 12 private OutputStream oStream; 13 private static final String TAG = "ChatHandler"; 14 15 @Override 16 public void run() { 17 try { 18 19 iStream = socket.getInputStream(); 20 oStream = socket.getOutputStream(); 21 byte[] buffer = new byte[1024]; 22 int bytes; 23 handler.obtainMessage(WiFiServiceDiscoveryActivity.MY_HANDLE, this) 24 .sendToTarget(); 25 26 while (true) { 27 try { 28 // Read from the InputStream 29 bytes = iStream.read(buffer); 30 if (bytes == -1) { 31 break; 32 } 33 34 // Send the obtained bytes to the UI Activity 35 Log.d(TAG, "Rec:" + String.valueOf(buffer)); 36 handler.obtainMessage(WiFiServiceDiscoveryActivity.MESSAGE_READ, 37 bytes, -1, buffer).sendToTarget(); 38 } catch (IOException e) { 39 Log.e(TAG, "disconnected", e); 40 } 41 } 42 } catch (IOException e) { 43 e.printStackTrace(); 44 } finally { 45 try { 46 socket.close(); 47 } catch (IOException e) { 48 e.printStackTrace(); 49 } 50 } 51 } 52 53 public void write(byte[] buffer) { 54 try { 55 oStream.write(buffer); 56 } catch (IOException e) { 57 Log.e(TAG, "Exception during write", e); 58 } 59 } 60 61}
原因はもともとのプログラムではwhile(true)で無限ループとなっていた受信待ち部分が書き換えたことにより消えてしまったことだと思うのですが、
ChatManager
1whle(true){ 2 copyFile(iStream, bospv);//受信データをbospvにコピー 3 pvbyte = bospv.toByteArray(); 4 handler.obtainMessage(WiFiServiceDiscoveryActivity.MESSAGE_READ, pvbyte).sendToTarget();//結果をアクティビティへ 5}
とすると同じ画像を無限に取得し続けすぐにアプリが落ちます。また、
ChatManager
1 while (true) { 2 try { 3 // Read from the InputStream 4 bytes = iStream.read(buffer); 5 if (bytes == -1) { 6 Log.d(TAG, "loop end"); 7 break; 8 } 9 bospv.write(buffer,0,bytes); 10 } catch (IOException e) { 11 Log.e(TAG, "disconnected", e); 12 } 13 } 14 pvbyte=bospv.toByteArray(); 15 handler.obtainMessage(WiFiServiceDiscoveryActivity.MESSAGE_READ, pvbyte).sendToTarget();
とするとbytesが-1になることがなくいつまでもobtainMessageが呼ばれません。
修正方法や構造の間違いなどご指摘お願いいたします。
(追記)
1回は送信できることを確認しているためsocket.close()後にまた新たにsocketやChatManagerを作成することで対応できないかと考えたのですがどうでしょうか。

回答1件
あなたの回答
tips
プレビュー