2017-09-06 118 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(); 

如果你仍然得到连接重置,可能是因为对方关闭了连接。