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}
あなたの回答
tips
プレビュー