2017-09-06 19 views
-2

私は現在、Androidに簡単な イメージサーバーを作成する作業を進めています。Android AsyncTaskのjava.net.SocketException

これは...

new Thread(new Runnable() 
{ 
    public void run() 
    { 
     try 
     { 
      ServerSocket serverSocket = new ServerSocket(8080); 

      while(true) 
      { 
       Socket client = serverSocket.accept(); 

       SimpleImageSender sender 
        = new SimpleImageSender(client); 
       sender.execute(); 
      } 
     } 

     catch(Exception e) 
     { 
      e.printStackTrace(); 
     }  
    } 
}).start(); 

サーバ・クラスであり、これはAsyncTaskです。

public class SimpleImageSender extends HttpGetForMapTileHandler<Void,Void,Void> 
{ 
    protected Socket client; 

    public SimpleImageSender(Socket socket) 
    { 
     super(); 
     this.client = socket; 
    } 

    @Override 
    protected Void doInBackground(Void... params) 
    { 
     try 
     { 
      URL url = new URL("http://www.imageFromWeb.png"); 
      HttpURLConnection httpCon = (HttpURLConnection)url.openConnection(); 
      httpCon.setRequestMethod("GET"); 
      httpCon.connect(); 

      if(httpCon.getResponseCode() == 200) 
      { 
       DataOutputStream out = new DataOutputStream(this.client.getOutputStream()); 
       byte response[] = new byte[BUFFER_SIZE]; 
       int index = httpCon.getInputStream().read(response,0,BUFFER_SIZE); 
       while(index != -1) 
       { 
        out.write(response,0,index);//*** 
        index = httpCon.getInputStream().read(response,0,BUFFER_SIZE); 
       } 

       out.flush(); 
      } 
      else 
      { 
       Log.d("AAA","No png"); 
      } 
     } 

     catch(Exception e) 
     { 

      e.printStackTrace(); 
      cancel(true); 
     } 

     return null; 
    } 
} 

私は、Android 6.0(ネクサス5)でこのコードをテストし、java.net.SocketExceptionがライン//***が3回以上呼ば occers。

これは私が持っているコールスタックです。

09-06 18:03:42.763 20730-22167/com.example.SimpleImageSenderServer 
W/System.err: java.net.SocketException: sendto failed: ECONNRESET 
(Connection reset by peer) 
09-06 18:03:42.763 20730-22167/com.example.SimpleImageSenderServer 
W/System.err:  at 
libcore.io.IoBridge.maybeThrowAfterSendto(IoBridge.java:542) 
09-06 18:03:42.763 20730-22167/com.example.SimpleImageSenderServer 
W/System.err:  at libcore.io.IoBridge.sendto(IoBridge.java:511) 
09-06 18:03:42.764 20730-22167/com.example.SimpleImageSenderServer 
W/System.err:  at 
java.net.PlainSocketImpl.write(PlainSocketImpl.java:500) 
09-06 18:03:42.764 20730-22167/com.example.SimpleImageSenderServer 
W/System.err:  at java.net.PlainSocketImpl.- 
wrap1(PlainSocketImpl.java) 
09-06 18:03:42.764 20730-22167/com.example.SimpleImageSenderServer 
W/System.err:  at 
java.net.PlainSocketImpl$PlainSocketOutputStream. 
write(PlainSocketImpl.java:266) 
09-06 18:03:42.764 20730-22167/com.example.SimpleImageSenderServer 
W/System.err:  at 
java.io.DataOutputStream.write(DataOutputStream.java:98) 
09-06 18:03:42.765 20730-22167/com.example.SimpleImageSenderServer 
W/System.err:  at 
com.example.SimpleImageSenderServer. 
SimpleImageSender.doInBackground(SimpleImageSender.java:xx) 

はまた、私は

  1. でのAndroid 4.4.2、5.0デバイスをテストしたときに、このエラーが発生しなかったことをimformたいです。
  2. 仮想デバイス(Android 7.0)。

私は インターネットを通じてjava.net.SocketExceptionが問題をチェックしますが、私は、原因だったもの をそれを把握することができませんでした。

アドバイスは非常に役に立ちます。 ありがとう

答えて

0

メインスレッドで操作を実行することはできません。それは非同期で行う必要があります。

2つのオプションがあります。無効にするかstrictmode:

if (android.os.Build.VERSION.SDK_INT > 9) { 
    StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder() 
      .permitAll().build(); 
    StrictMode.setThreadPolicy(policy); 
} 

または接続のためのasynctaskを使用するにはあまりにも

+0

実際に '接続リセット'が発生しますか? – EJP

+0

他の解決方法もありますが([https://stackoverflow.com/questions/36871636/java-net-socketexception-sendto-failed-econnreset-connection-reset-by-peer) //stackoverflow.com/questions/11207394/getting-socketexception-connection-reset-by-peer-in-android) – Zoe

0
int index = httpCon.getInputStream().read(response,0,BUFFER_SIZE); 
while(index != -1) 
{ 
    out.write(response,0,index);//*** 
    index = httpCon.getInputStream().read(response,0,BUFFER_SIZE); 
} 

これはゴミ、または少なくとも不完全に書かれており、不十分という名前です。 read()は、インデックスではなく、カウントを返します。これを試してください:

まだ接続がリセットされるのは、おそらくピアが接続を終了したためです。