2017-12-20 28 views
0

こんにちは、私は、サーバーにメッセージを送信し、返信を返すと思います。私はfailed 1recvfrom failed: EBADF (Bad file descriptor)エラーを取得し続け、私はこのソケットのものに新しいです。うまくいけば誰かが私を助けることができます。ソケットを使用してサーバーからメッセージを送受信する方法は?

private class SendDataAsyncTask extends AsyncTask<Void,Void,Void> 
    { 
     private String reply = ""; 
     @Override 
     protected Void doInBackground(Void... params) 
     { 
      try { 
       Socket socket = new Socket("ip",portNumber); 
       PrintWriter printWriter = new PrintWriter(socket.getOutputStream()); 
       //printWriter.write("hello there"); 

       printWriter.println("hello there"); 
       bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream())); 
       printWriter.flush(); 
       reply = bufferedReader.readLine(); 
       if(reply != null && !reply.equals("")) 
       { 
        Log.d(SOCKET_TESTING_TAG,"my message is " + reply); 
       } 
       else 
       { 
        Log.d(SOCKET_TESTING_TAG,"no message yet"); 
       } 
       Log.d(SOCKET_TESTING_TAG,"break 3"); 
       printWriter.close(); 

      } 
      catch (IOException e) 
      { 
       Log.d(SOCKET_TESTING_TAG,"failed " + e.getMessage()); 
       e.printStackTrace(); 
      } 
      return null; 
     } 
     @Override 
     public void onPostExecute(Void var) 
     { 
      tv_response.setText(reply); 
     } 
    } 
  • 注:ここでは私の非同期タスクの声明は、私はまだエラーを取得printWriter.flush()前にヌルのreadlineをチェックする場合、私は置くとき。他のストリームとソケットを閉じたソケットの入力または出力ストリームを閉じる

答えて

1
printWriter.close(); 

。両方のオカレンスを削除します。

if(bufferedReader.readLine() != null) 

これは意味をなさない。あなたは行を投げ捨てて、それがヌルでないなら次の行を読んでいます。結果を変数に格納する必要があります。

おそらくprintWriter.write()の代わりにprintWriter.println()を使用する必要があります。おそらくピアもラインを読んでいるので、あなたは1つも送信していません(ラインターミネータはありません)。

reply == nullの場合、ピアが接続を終了したことを意味します。メッセージはまだありません。空文字列はプロトコルエラーかもしれませんが、「まだメッセージがありません」ではありません。

+0

質問で自分のコードを更新しました。私は 'reply'変数にbufferedReader.readLine()を格納しました。しかし、返信変数を設定した後のLOGステートメントは実行されず、なぜ私はこれを正しく書いたかったのか分からない。 – TheQ

+0

おそらく 'printWriter.write()'の代わりに 'printWriter.println()'を使う必要があります。おそらく、相手も行を読んでいるので、あなたはそれを送信していません。 – EJP

+0

printWriterには、私のアンドロイドスタジオコンパイラで見られるようなprintln()メソッドがありません。そして、私はあなたが「ピアもラインを読んでいて、それを送っていない」と言ったときは分かりません。明確にすることができますか? – TheQ

関連する問題