gpt4 book ai didi

java - Android 错误 : java.net.SocketException:套接字已关闭

转载 作者:搜寻专家 更新时间:2023-10-30 19:56:41 24 4
gpt4 key购买 nike

我看到这个错误每周出现在我的崩溃日志中数百次,但此时我已经花了几周时间试图找出错误但没有成功。我一直无法在我的任何设备上重现它。这是堆栈跟踪:

Posix.java:-2 in "libcore.io.Posix.recvfromBytes"
Posix.java:131 in "libcore.io.Posix.recvfrom"
BlockGuardOs.java:164 in "libcore.io.BlockGuardOs.recvfrom"
IoBridge.java:513 in "libcore.io.IoBridge.recvfrom"
PlainSocketImpl.java:489 in "java.net.PlainSocketImpl.read"
PlainSocketImpl.java:46 in "java.net.PlainSocketImpl.access$000"
PlainSocketImpl.java:241 in "java.net.PlainSocketImpl$PlainSocketInputStream.read"
AbstractSessionInputBuffer.java:103 in "org.apache.http.impl.io.AbstractSessionInputBuffer.fillBuffer"
AbstractSessionInputBuffer.java:191 in "org.apache.http.impl.io.AbstractSessionInputBuffer.readLine"
DefaultResponseParser.java:82 in "org.apache.http.impl.conn.DefaultResponseParser.parseHead"
AbstractMessageParser.java:174 in "org.apache.http.impl.io.AbstractMessageParser.parse"
AbstractHttpClientConnection.java:180 in "org.apache.http.impl.AbstractHttpClientConnection.receiveResponseHeader"
DefaultClientConnection.java:235 in "org.apache.http.impl.conn.DefaultClientConnection.receiveResponseHeader"
AbstractClientConnAdapter.java:259 in "org.apache.http.impl.conn.AbstractClientConnAdapter.receiveResponseHeader"
HttpRequestExecutor.java:279 in "org.apache.http.protocol.HttpRequestExecutor.doReceiveResponse"
HttpRequestExecutor.java:121 in "org.apache.http.protocol.HttpRequestExecutor.execute"
DefaultRequestDirector.java:428 in "org.apache.http.impl.client.DefaultRequestDirector.execute"
AbstractHttpClient.java:555 in "org.apache.http.impl.client.AbstractHttpClient.execute"
AbstractHttpClient.java:487 in "org.apache.http.impl.client.AbstractHttpClient.execute"
AbstractHttpClient.java:465 in "org.apache.http.impl.client.AbstractHttpClient.execute"
Utilities.java:484 in "com.myapp.android.Utilities$8.run"

这是错误来源的代码块...发生崩溃的确切位置是 HttpResponse response = httpclient.execute(httppost);:

 public static HttpPost postData(String URL, final List<NameValuePair> params, final Handler handler) {
// Create a new HttpClient and Post Header
//android.util.Log.d("Utilities", "Called postData");
final HttpClient httpclient = new DefaultHttpClient();
//httpclient.
final HttpPost httppost = new HttpPost(URL);
final Message msg = new Message();
final Bundle dataBundle = new Bundle();
final ByteArrayOutputStream out = new ByteArrayOutputStream();

new Thread(){
@Override
public void run(){
String error = "";
String data = "";
try {
httppost.setEntity(new UrlEncodedFormEntity(params));
HttpResponse response = httpclient.execute(httppost);
StatusLine statusLine = response.getStatusLine();
if(statusLine.getStatusCode() == HttpStatus.SC_OK){
response.getEntity().writeTo(out);
out.close();
data = out.toString();
} else{
error = EntityUtils.toString(response.getEntity());
}
} catch (ClientProtocolException e) {
AirbrakeNotifier.notify(e);
error = e.toString();
} catch (IOException e) {
AirbrakeNotifier.notify(e);
error = e.toString();
} catch (Exception ex) {
AirbrakeNotifier.notify(ex);
error = ex.toString();
}
dataBundle.putString("error", error);
dataBundle.putString("data", data);
msg.setData(dataBundle);
handler.dispatchMessage(msg);
}
}.start();
return httppost;
}

非常感谢任何帮助最终解决这个问题的人!

最佳答案

在我看来,这个问题的罪魁祸首不是您的应用程序,而是远程端(即 HTTP 服务器)。最有可能的是 HTTP 服务器突然重置连接,这会导致您的应用程序中出现 SocketException。在生产环境中,这些事情经常发生。可能是由于 HTTP 服务器过载,某些异常情况可能导致服务器关闭(HTTP 请求泛滥,甚至在远程服务器资源耗尽时请求数量增加;服务器也可能耗尽它的本地套接字池......原因可能有几十个)。

如果与成功的 HTTP 请求相比这些错误的比例较低,我不会太担心,我只是将那段代码包装到 try { ... } catch (SocketException e ) { ... } 语句并向用户显示一个对话框,告诉他们请求失败,他们应该重试。

我肯定会做的是尝试确定此行为的原因:我会尝试匹配这些异常之一的时间,并尝试深入研究接近该时间的 HTTP 服务器日志,以尝试确定原因这种突然断开连接(假设您可以访问该日志和其他诊断工具)。正如我之前所说,这可能是一件愚蠢的事情,或者调试起来有点复杂,但我敢打赌这就是问题所在。

关于java - Android 错误 : java.net.SocketException:套接字已关闭,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24620953/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com