質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Q&A

解決済

1回答

3448閲覧

socket通信による画像の複数回送信(android)

Mustard

総合スコア11

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

0グッド

1クリップ

投稿2019/05/10 09:33

編集2019/05/10 14:57

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を作成することで対応できないかと考えたのですがどうでしょうか。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

keicha_hrs

2019/05/10 14:00

Socket.IOタグはこの質問には関係ないので外しましょう。
guest

回答1

0

ベストアンサー

Streamと名のつくものは、一連なりのデータと考えましょう。
順番にデータを読み込み、あるいは、順番にデータを書き込みます

順番にデータを読み込んでいって、データが尽きると、そこからはデータが読めなくなります
も一度最初からデータを読みたい場合は、
・ファイル位置のポインタを最初に設定し直す
・そのStreamを作成し直す
のいずれかの操作を行う必要があります

投稿2019/05/10 12:04

y_waiwai

総合スコア87774

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Mustard

2019/05/11 08:05

おっしゃる通りでした。 socket.close後にクライアント側が nHandler =new ClientSocketHandler(this.handler,groupOwnerAddress); nHandler.start(); を呼び出すことで解決いたしました。 迅速な回答にお礼申し上げます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問