2016-11-21 6 views
2

こんにちは私はソケットを使用してサーバーに接続するためにサーバーにデータを送信するのに問題があります。私はAsynTaskを使用してサーバーにデータを送信します。そして、私は問題を抱えています:Java Androidサーバーにデータを送信するapplacation onPostExecute()を使用しない

アプリケーションがデータを送信するとき、私のアプリはこのアクションを終わらせるのを見ず、onPostExecute()を使用しません。

これは私のコードです:

public class MyClientTask extends AsyncTask<Void, Void, Void> { 

     String dstAddress; 
     int dstPort; 
     String response = ""; 

     MyClientTask(String addr, int port) { 
      dstAddress = addr; 
      dstPort = port; 
     } 

     @Override 
     protected Void doInBackground(Void... arg0) { 
//   if (pingHost(1000)) { 
      socket = null; 
      try { 
       socket = new Socket(dstAddress, dstPort); 
       ByteArrayOutputStream byteArrayOutputStream = 
         new ByteArrayOutputStream(1024); 
       byte[] buffer = new byte[1024]; 
       DataOutputStream outputStream = new DataOutputStream(socket.getOutputStream()); 

       byte[] theByteArray = message.getBytes(); 
       lengthMessage = (short) theByteArray.length; 

       outputStream.writeByte((byte) 0xB); 
       outputStream.writeByte((byte) 0xA); 
       outputStream.writeByte((byte) 0xA); 
       outputStream.writeByte((byte) 0xD); 
       outputStream.writeShort(lengthMessage); 
       outputStream.write(theByteArray); 
       outputStream.writeShort(width); 
       outputStream.writeShort(height); 
       outputStream.writeInt(lengthbmp); 
       outputStream.writeInt(lengthResizebmp); 
       outputStream.writeShort(11); 
       outputStream.write(imageInByte); 
       outputStream.write(imageResizeInByte); 
       outputStream.writeByte((byte) 0xB); 
       outputStream.writeByte((byte) 0xE); 
       outputStream.writeByte((byte) 0xE); 
       outputStream.writeByte((byte) 0xF); 

       try { 
        Thread.sleep(2000); 
       } catch (InterruptedException e) { 
        e.printStackTrace(); 
       } 


       int bytesRead; 
       InputStream inputStream = socket.getInputStream(); 

       while ((bytesRead = inputStream.read(buffer)) != -1) { 
        byteArrayOutputStream.write(buffer, 0, bytesRead); 
        response += byteArrayOutputStream.toString("UTF-8"); 
       } 

       outputStream.flush(); 
       outputStream.close(); 

      } catch (UnknownHostException e) { 
       e.printStackTrace(); 
       isSuccsess = false; 
       response = "UnknownHostException: " + e.toString(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
       Log.d("la", "nie udało sie"); 
       isSuccsess = false; 
       response = "IOException: " + e.toString(); 
      } 
      return null; 
     } 

     @Override 
     protected void onPostExecute(Void result) { 
      super.onPostExecute(result); 
      if (socket != null) { 
       try { 
        socket.shutdownInput(); 
        socket.shutdownOutput(); 
        socket.close(); 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } 
      } 
      if(isSuccsess){ 
       Toast.makeText(MainActivity.this, "Zdjęcie zostało wysłane !" , Toast.LENGTH_LONG).show(); 
       bm = null; 
       clearEt(); 
       ivImage.setImageBitmap(bm); 
      } 
      else{ 
       Toast.makeText(MainActivity.this , "Nie udało się wysłać zdjęcia !" , Toast.LENGTH_LONG).show(); 
      } 

      pbWheel.setVisibility(View.INVISIBLE); 
     } 

     @Override 
     protected void onPreExecute() { 
      super.onPreExecute(); 
      pbWheel.setVisibility(View.VISIBLE); 
     } 
    } 
+0

もう一度質問を投稿しないでください。あなたの最初の投稿で質問に答えてください。http://stackoverflow.com/questions/40679274/java-android-socket-dont-disconnect – greenapps

+0

コンソールをチェックしましたか?つまり、例外はありますか? – mallaudin

+0

@mallaudin例外はありません –

答えて

1

あなたはAsyncTask<Void,Void,Integer>を使用して、代わりにdoInBackgroundでヌルのいずれかの整数を返すことができます。

だけ

return 1; 

return null; 

(doInBackgroundに)置き換えると(AsyncTask宣言に)置き換える

public class MyClientTask extends AsyncTask<Void, Void, Void> { 

public class MyClientTask extends AsyncTask<Void, Void, Integer> { 
付き
+0

AsyncTask void以外の型は3番目のパラメータ –

+1

では問題ありません。 'AsyncTask 'は 'onPostExecute'を呼び出します。 – mallaudin

+0

void戻り値の型を使用するとdoInBackgroundからデータが返されず、したがってonPostExecuteは呼び出されないと仮定しました。私は代わりにIntegerを使うことを確信しています。 –

0

この行を実行していますか?

while ((bytesRead = inputStream.read(buffer)) != -1) { 
        byteArrayOutputStream.write(buffer, 0, bytesRead); 
        response += byteArrayOutputStream.toString("UTF-8"); 
       } 

asyncTaskのソケットの代わりにURLConnectionを使用します。

1

getInputStream()は、をブロックするであることに注意してください。サーバーからデータを受信するまでブロックされます。あなたのケースでは、ではありませんサーバーからの応答を待つgetInputStream()を呼び出す前にサーバーにデータをフラッシュしていません。これで、サーバーにデータを送信していないので、レスポンスを得るにはソケットが入力待ちのスレッドをブロックします。

の前にデータをフラッシュしてスレッドをスリープさせる必要があります。終了したストリームは下位のソケットを閉じるため、完了したらすべてのストリームを閉じます。ドキュメントから:

返されたOutputStreamを閉じると、関連するソケットが閉じられます。

返されたInputStreamを閉じると、関連付けられたソケットが閉じられます。

outputStream.flush(); // flush it before sleep and don't close 
// outputStream.close(); don't close it here 
try { 
        Thread.sleep(2000); 
       } catch (InterruptedException e) { 
        e.printStackTrace(); 
       } 


       int bytesRead; 
       InputStream inputStream = socket.getInputStream(); 

       while ((bytesRead = inputStream.read(buffer)) != -1) { 
        byteArrayOutputStream.write(buffer, 0, bytesRead); 
        response += byteArrayOutputStream.toString("UTF-8"); 
       } 
関連する問題