Android AsyncTask 中的 java.net.SocketException
Posted
技术标签:
【中文标题】Android AsyncTask 中的 java.net.SocketException【英文标题】:java.net.SocketException in Android AsyncTask 【发布时间】:2018-02-14 18:00:05 【问题描述】:我现在正致力于创建简单的 android 中的图像服务器。
这是服务器类...
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
当线路//***
调用超过两次时发生。
这是我得到的调用堆栈。
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)
我还想告知我在测试时没有发生此错误
-
Android 4.4.2、5.0 设备。
虚拟设备 (Android 7.0)。
我通过以下方式检查了 java.net.SocketException 问题 互联网,但我想不通 是什么原因。
任何建议都会很有帮助。 谢谢
【问题讨论】:
【参考方案1】:你永远不能在主线程上进行线程操作。它必须异步完成。
所以你有两个选择。要么禁用严格模式:
if (android.os.Build.VERSION.SDK_INT > 9)
StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder()
.permitAll().build();
StrictMode.setThreadPolicy(policy);
或者也使用异步任务进行连接
【讨论】:
这真的会导致“连接重置”吗? Most 可能是的,尽管there are other solutions【参考方案2】: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();
如果你仍然得到连接重置,那可能是因为对端已经关闭了连接。
【讨论】:
以上是关于Android AsyncTask 中的 java.net.SocketException的主要内容,如果未能解决你的问题,请参考以下文章
无法在Asynctask Android,java中调用View