2017-09-06 97 views
-2

我現在正在Android中創建簡單的 圖像服務器。Android中的java.net.SocketException AsyncTask

這是服務器級...

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(的Nexus 5)測試此代碼,java.net.SocketException異常 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) 

我也想imform,當我在

  1. 測試的是Android 4.4.2,5.0設備,這個錯誤並沒有發生。
  2. 虛擬設備(Android 7.0)。

我通過 檢查java.net.SocketException異常問題Internet,但我無法弄清楚 究竟是什麼原因。

任何建議將是非常有益的。 謝謝

回答

0

你永遠不能在主線程上進行線程操作。它必須做到異步。

所以你有兩個選擇。或者禁用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

[Most](https://stackoverflow.com/questions/36871636/java-net-socketexception-sendto-failed-econnreset-connection-reset-by-peer)可能是的,雖然[還有其他解決方案](https: //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()返回一個計數,而不是索引。試試這個:

int count; 
while((count = httpCon.getInputStream().read(response)) > 0) 
{ 
    out.write(response,0,count); 
} 
// The following are completey missing from your code 
out.close(); 
httpCon.getInputStream().close(); 

如果你仍然得到連接重置,可能是因爲對方關閉了連接。