我正在开发一个从Web服务器下载数据的应用程序,一开始似乎没有任何问题,但是几天前我开始收到这种异常:javax.net.ssl.SSLException: Read error: ssl=0x7a6588: I/O error during system call, Connection reset by peer我不确定是什么原因引起的问题以及如何解决。这是整个LogCat消息:
12-12 11:43:27.950: W/System.err(22010): javax.net.ssl.SSLException: Read error: ssl=0x7a6588: I/O error during system call, Connection reset by peer
12-12 11:43:27.960: W/System.err(22010): at org.apache.harmony.xnet.provider.jsse.NativeCrypto.SSL_read(Native Method)
12-12 11:43:27.960: W/System.err(22010): at org.apache.harmony.xnet.provider.jsse.OpenSSLSocketImpl$SSLInputStream.read(OpenSSLSocketImpl.java:788)
12-12 11:43:27.960: W/System.err(22010): at org.apache.harmony.luni.internal.net.www.protocol.http.ChunkedInputStream.read(ChunkedInputStream.java:50)
12-12 11:43:27.960: W/System.err(22010): at java.io.InputStream.read(InputStream.java:157)
12-12 11:43:27.960: W/System.err(22010): at java.util.zip.InflaterInputStream.fill(InflaterInputStream.java:225)
12-12 11:43:27.960: W/System.err(22010): at java.util.zip.InflaterInputStream.read(InflaterInputStream.java:178)
12-12 11:43:27.960: W/System.err(22010): at java.util.zip.GZIPInputStream.read(GZIPInputStream.java:174)
12-12 11:43:27.960: W/System.err(22010): at java.io.BufferedInputStream.read(BufferedInputStream.java:319)
12-12 11:43:27.970: W/System.err(22010): at java.io.FilterInputStream.read(FilterInputStream.java:133)
12-12 11:43:27.970: W/System.err(22010): at com.stampii.stampii.synchronization.Synchronization.UseHttpsConnection(Synchronization.java:1367)
12-12 11:43:27.970: W/System.err(22010): at com.stampii.stampii.synchronization.Synchronization$ActivateCollection.doInBackground(Synchronization.java:613)
12-12 11:43:27.970: W/System.err(22010): at com.stampii.stampii.synchronization.Synchronization$ActivateCollection.doInBackground(Synchronization.java:1)
12-12 11:43:27.970: W/System.err(22010): at android.os.AsyncTask$2.call(AsyncTask.java:185)
12-12 11:43:27.970: W/System.err(22010): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:306)
12-12 11:43:27.970: W/System.err(22010): at java.util.concurrent.FutureTask.run(FutureTask.java:138)
12-12 11:43:27.970: W/System.err(22010): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1088)
12-12 11:43:27.970: W/System.err(22010): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:581)
12-12 11:43:27.970: W/System.err(22010): at java.lang.Thread.run(Thread.java:1027)
这就是我的UseHttpsConnection方法:
public void UseHttpsConnection(String url, String charset, String query) {
try {
final TrustManager[] trustAllCerts = new TrustManager[] { new X509TrustManager() {
@Override
public void checkClientTrusted( final X509Certificate[] chain, final String authType ) {
}
@Override
public void checkServerTrusted( final X509Certificate[] chain, final String authType ) {
}
@Override
public X509Certificate[] getAcceptedIssuers() {
return null;
}
} };
// Install the all-trusting trust manager
final SSLContext sslContext = SSLContext.getInstance( "TLS" );
sslContext.init( null, trustAllCerts, new java.security.SecureRandom() );
// Create an ssl socket factory with our all-trusting manager
final SSLSocketFactory sslSocketFactory = sslContext.getSocketFactory();
if (url.startsWith("https://")) {
HttpsURLConnection.setDefaultHostnameVerifier(new HostnameVerifier(){
public boolean verify(String hostname, SSLSession session) {
return true;
}});
}
System.setProperty("http.keepAlive", "false");
HttpsURLConnection connection = (HttpsURLConnection) new URL(url).openConnection();
connection.setSSLSocketFactory( sslSocketFactory );
connection.setDoOutput(true);
connection.setConnectTimeout(15000 /* milliseconds */ );
connection.setRequestMethod("POST");
connection.setRequestProperty("Charset", charset);
connection.setRequestProperty("Content-Type","application/x-www-form-urlencoded;charset=" + charset);
OutputStream output = null;
try {
output = connection.getOutputStream();
output.write(query.getBytes(charset));
} catch (IOException e) {
e.printStackTrace();
showError2("Check your network settings!");
} finally {
if (output != null)
try {
output.close();
} catch (IOException logOrIgnore) {
logOrIgnore.printStackTrace();
}
}
int status = ((HttpsURLConnection) connection).getResponseCode();
Log.d("", "Status : " + status);
for (Entry<String, List<String>> header : connection
.getHeaderFields().entrySet()) {
Log.d("Headers","Headers : " + header.getKey() + "="+ header.getValue());
}
InputStream response = new BufferedInputStream(connection.getInputStream());
int bytesRead = -1;
byte[] buffer = new byte[30 * 1024];
while ((bytesRead = response.read(buffer)) > 0) {
byte[] buffer2 = new byte[bytesRead];
System.arraycopy(buffer, 0, buffer2, 0, bytesRead);
handleDataFromSync(buffer2);
}
connection.disconnect();
} catch (IOException e) {
e.printStackTrace();
showError2("Synchronization failed!Please try again.");
} catch (KeyManagementException e) {
e.printStackTrace();
showError2("Error occured.Please try again.");
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
showError2("Error occured.Please try again.");
}
}
这是我用来连接和下载数据的AsyncTask:
public class DeactivateCollection extends AsyncTask <Context, Integer, Void> {
@Override
protected Void doInBackground(Context... arrContext) {
try {
String charset = "UTF-8";
hash = getAuthHash();
SharedPreferences lastUser = PreferenceManager
.getDefaultSharedPreferences(Synchronization.this);
int userId = lastUser.getInt("lastUser", 1);
systemDbHelper = new SystemDatabaseHelper(Synchronization.this, null, 1);
systemDbHelper.initialize(Synchronization.this);
String sql = "SELECT dbTimestamp FROM users WHERE objectId=" + userId;
Cursor cursor = systemDbHelper.executeSQLQuery(sql);
if (cursor.getCount() < 0) {
cursor.close();
} else if (cursor.getCount() > 0) {
cursor.moveToFirst();
timeStamp = cursor.getString(cursor.getColumnIndex("dbTimestamp"));
Log.d("", "timeStamp : " + timeStamp);
}
String query = String.format("debug_data=%s&"
+ "client_auth_hash=%s&" + "timestamp=%s&"
+ "deactivate_collections=%s&" + "client_api_ver=%s&"
+ "set_locale=%s&" + "device_os_type=%s&"
+ "device_sync_type=%s&"
+ "device_identification_string=%s&"
+ "device_identificator=%s&" + "device_resolution=%s",
URLEncoder.encode("1", charset),
URLEncoder.encode(hash, charset),
URLEncoder.encode(timeStamp, charset),
URLEncoder.encode(Integer.toString(deac), charset),
URLEncoder.encode(clientApiVersion, charset),
URLEncoder.encode(locale, charset),
URLEncoder.encode(version, charset),
URLEncoder.encode("14", charset),
URLEncoder.encode(version, charset),
URLEncoder.encode(deviceId, charset),
URLEncoder.encode(resolution, charset));
Log.e("","hash : "+hash);
Log.e("","deactivate : "+Integer.toString(deac));
SharedPreferences useSSLConnection = PreferenceManager.getDefaultSharedPreferences(Synchronization.this);
boolean useSSl = useSSLConnection.getBoolean("UseSSl", true);
if (useSSl) {
UseHttpsConnection(url, charset, query);
} else {
UseHttpConnection(url, charset, query);
}
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
@Override
protected void onProgressUpdate(Integer... progress) {
Log.d("","ON PROGRESS UPDATE");
}
@Override
protected void onCancelled() {
Log.d("","ON CANCELLED");
}
@Override
protected void onPreExecute()
{
Log.d("","ON PRE EXECUTE");
}
@Override
protected void onPostExecute(Void v) {
Log.d("","ON POST EXECUTE");
}
}
因此,任何人都知道如何处理该异常,这样我就可以毫无例外地下载整个数据。或者,如果不可能的话,我该如何解决。
提前致谢!
在这种情况下,实际上有两种选择。您可以在通过Internet下载数据时捕获该异常,并创建一个函数,该函数将从停止的位置再次开始连接。因此,您必须找到一种在下载数据时保存进度的方法,因为如果要下载大量数据,则重新开始该过程不是一个好主意。
您可以做的另一件事是创建一个对话框,该对话框将通知用户同步时出错,并让他选择是否要重试该操作或取消该操作。如果用户选择“重试”选项,我认为它将是一个更好的选择是从再次停止的地方重新开始连接。因此,您必须同时保存两种方式的进度。我认为这更加人性化。
我这个程序采用的是netty,此程序中有客户端和服务端。 程序思路:服务端接受消息后在利用客户端发给别的服务端。 出现问题:时不时会出现这个异常,也不知道是那报的异常,经过查资料此异常是由某一端断开,发生的连接异常 ,我的客户端做了断开重连 但是并没发现重连的log ,难道是上游的客户端断开,那我的服务端也不应该报异常啊。不是很清楚? 有知道的吗?或者提供解决思路。 客户端重连代码 断开后进入重连
我正在编写Android应用程序,从一个网站下载特定的文件(目前为20M字节),以供测试之用。我使用URLConnection和BufferedInputStream。 下载了几兆字节后,我收到对等体重置的IOException连接。 InputStream.Read()暂停了大约130秒,然后引发异常。 经过几次尝试,我注意到下载的字节是11,272,192或11,010,048,知道文件可以从
我在RabbitMQ上犯了stainger错误。我发送了一些关于MQ和Php产品的信息,但出现了一些问题。我可以在出现异常“errno=104由对等方重置连接”的一分钟后发送消息。见下文: rabbitmq-3.6的版本。1,php-7.0版本。5,php amqp库的版本-“Videlavaro/php amqplib”:“~2.7 来自rabbitmq的日志:
问题内容: 建立: selenium :3.141.0 的Python :3.6.7 heroku-stack :heroku-18 headless-chrome :安装了v71.0.3578.80 buildpack chromedriver :已安装v2.44.609551 buildpack 在heroku中使用selenium时出现此错误: 我用谷歌搜索,但是没有运气。错误发生在此代码的
问题内容: 我使用httpclient 4.4发送get和post请求。我刚刚创建了一个简单的httpclient包装器,以方便使用: 当我使用此类发送帖子请求时。发生了一些奇怪的事情: 第一次,我将发布请求发送到服务器,几分钟后没问题,我将相同的请求发送到服务器,也行。但是几分钟后,我发送了相同的请求,出现了错误: 但是之后,我仍然向服务器发送了相同的请求,再次可以。 每当我按照上述步骤尝试时,
我正在使用Spring 5网络流量、SpringBoot 2和Reactive MongoDB构建一个POC。在使用maven插件构建项目时,我得到了如下错误MongoDB连接错误:- 以下是我的申请表。属性文件:- 波姆。xml:- 请告知这里可能存在什么问题?我是否需要在我的机器上显式安装MongoDB并在运行此项目之前运行它。我相信MongoDB实例将自行运行,因为SpringBoot将在运