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

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

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

Socket.IOはNode.js上で動くライブラリであり、すべてのブラウザとモバイルデバイスでリアルタイムのアプリを作動させる事を目的としています。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

Q&A

0回答

2031閲覧

Android Studioにおける非同期通信について

shalllaugh

総合スコア17

Socket.IO

Socket.IOはNode.js上で動くライブラリであり、すべてのブラウザとモバイルデバイスでリアルタイムのアプリを作動させる事を目的としています。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

0グッド

0クリップ

投稿2018/11/20 07:02

編集2018/11/21 05:21

Android Studioを用いてAndroid向けのアプリケーションを開発しています。
2台の端末間で文字列のやり取りをするためのプログラムを書いているのですが、受信処理がうまくいかず困っています。

AsyncTaskによる非同期通信で実装しようと思っているのですが、ボタンの設定を行っているbuttonMethodとは別にstartSessionを用意して、ボタンを押した時にstartSessionを呼び出すような形で作っています。

これらのコードでおそらくstartSessionを呼び出すことには成功していると思います。
理由としましては、該当するボタンをアプリケーション上でタップすると、受信した文字列を表示するTextViewに「NG」と表示されていることが挙げられます。
初期設定してあるString型のrsが返ってきてはいるので、何かしらの理由で受信待ち状態が正常に行われていないのではないかと考えているのですが、その解決策がわかりません。

原因が何なのか、そしてどこを改善すればよいのかお教えください。

java

1/* ------ メイン処理 ------ */ 2 public void buttonMethod(View b) { 3 4  /* ----- フィールド設定やその他のイベント分岐のif文につき割愛 ----- */ 5 6 /* - 入力がスタートの時 - */ 7 else if (chkEvent(s) == 7) { 8 startSession(); 9 } 10 }

java

1/* ------ 非同期通信処理 ------ */ 2 private void startSession() { 3 4 /* --- 問題表示ボックス取得 --- */ 5 final TextView que 6 = findViewById(R.id.question_box); 7 8 /* --- 非同期通信開始 --- */ 9 @SuppressLint("StaticFieldLeak") 10 AsyncTask<Void, Void, String> subtask 11 = new AsyncTask<Void, Void, String>() { 12 13 @Override 14 protected String doInBackground(Void... voids) { 15 16 /* - 文字列受信準備 - */ 17 String rs = "NG"; 18 ServerSocket ss = null; 19 BufferedReader br = null; 20 21 /* - 文字列受信 - */ 22 try { 23 ss = new ServerSocket(8080); 24 25 // 受信待機 26 Socket ws = ss.accept(); 27 28 // 受信文字列格納 29 br = new BufferedReader(new InputStreamReader( 30 ws.getInputStream())); 31 rs = br.readLine(); 32 33 // クローズ 34 br.close(); 35 ws.close(); 36 ss.close(); 37 } 38 catch (IOException e) { 39 e.printStackTrace(); 40 } 41 return rs; 42 } 43 44 /* 文字列表示 */ 45 @Override 46 protected void onPostExecute(String s) { 47 que.setText(s); 48 } 49 }; 50 subtask.execute(); 51 }

java

1 /* ------ メイン処理 ------ */ 2 3 /* ----- フィールド設定やその他のイベント分岐のif文につき割愛 ----- */ 4 // 出題 5 else if(chkEvent(s) == 6) { 6 setQ(inputStr); 7 } 8 } 9 } 10 11 /* ------ 問題文字列送信処理 ------ */ 12 private void setQ(final String question) { 13 14 // 通信対象端末指定 15 final String IP = "192.168.11.39"; 16 final int port = 8080; 17 18 /* --- ポート設定 --- */ 19 final InetSocketAddress isa 20 = new InetSocketAddress(IP, port); 21 22 /* --- 非同期通信 --- */ 23 @SuppressLint("StaticFieldLeak") 24 AsyncTask<InetSocketAddress, Void, Void> subtask 25 = new AsyncTask<InetSocketAddress, Void, Void>() { 26 27 /* - 文字列送信処理 - */ 28 @Override 29 protected Void doInBackground( 30 InetSocketAddress... inetSocketAddresses) { 31 Socket sq = null; 32 try { 33 34 /* - 接続 -*/ 35 sq = new Socket(); 36 sq.connect(isa); 37 38 /* - 出力ストリーム生成 - */ 39 BufferedWriter bw = new BufferedWriter( 40 new OutputStreamWriter(sq.getOutputStream())); 41 42 /* - データ送信 - */ 43 bw.write(question); 44 45 /* - クローズ - */ 46 bw.close(); 47 sq.close(); 48 } 49 catch (SocketException e) { 50 e.printStackTrace(); 51 } 52 catch (IOException e) { 53 e.printStackTrace(); 54 } 55 return null; 56 } 57 }; 58 subtask.execute(isa); 59 } 60 61}

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

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

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

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

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

y_waiwai

2018/11/20 07:44

クライアント側のコードも提示してください
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問