系统调用期间的I / O错误,通过对等方重置连接 [英] I/O error during system call, Connection reset by peer

查看:235
本文介绍了系统调用期间的I / O错误,通过对等方重置连接的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我们已经成功地使用HTTP网址从Web服务器获取数据近2年而没有任何打嗝。

We have been successfully fetching data from a web server with HTTP url for almost 2 years without any hiccups.

最近我们迁移到HTTPS以获得一些安全性当问题开始出现时。

In recent past we have migrated to HTTPS for some security reason.And that's when the problem blossomed.

随着WiFi一切正常,当我定期连接到2G口袋数据时,我正在通过服务器问题重置连接。

With WiFi everything works fine,When I connect to 2G pocket data periodically I'm getting connection reset by server issue.

我正在使用DefaultHttpClient连接到服务器。

I'm using DefaultHttpClient to connect to the server.

我尝试了很多工作,但没有任何救出我。

I have tried many work around but nothing rescued me.


  1. javax.net.ssl.SSLException:读取错误:ssl = 0x56e63588:系统调用期间的I / O错误,同级连接重置

我已将所有可用属性应用于HttpConnectionParams

I have applied all the available properties to HttpConnectionParams

HttpConnectionParams.setConnectionTimeout(httpClient.getParams(),120000);
HttpConnectionParams.setSoTimeout(httpClient.getParams(), 120000);
HttpConnectionParams.setLinger(httpClient.getParams(), 120000);
HttpConnectionParams.setTcpNoDelay(httpClient.getParams(), true);
HttpConnectionParams.setStaleCheckingEnabled(httpClient.getParams(), false);


  • 另一个谷歌小组讨论表明,这个问题可能是理想状态的原因所以我实现了这样的事情以保持屏幕清醒。

  • And another google group discussion suggested that this issue could be a cause of ideal state of an activity.So I implemented something like this to keep the screen awake.

    powerManager = (PowerManager) getSystemService(Context.POWER_SERVICE);
    wakeLock = powerManager.newWakeLock(PowerManager.FULL_WAKE_LOCK,"My Tag");
    wakeLock.acquire();
    


  • 并且在 onDestroy()我发布了 wakeLock.release();

    但是也没帮助。

    在服务器端还有什么我需要检查的吗?

    And is there is anything else I need to check at server end?

    推荐答案

    我遇到类似的SSL错误。事实证明,棒棒糖前设备不支持SSL TLSv1.1,TLSv1.2。我通过包含一个启用这些SSL协议的TLSSocketFactory包装类来修复它。
    尝试在代码中添加以下内容:

    I was having a similar SSL error. Turns out Pre-lollipop devices do not support SSL TLSv1.1, TLSv1.2. I fixed it by including a TLSSocketFactory wrapper class that enables these SSL protocols. Try adding the following to your code:

        static {
        final SSLSocketFactory sslSocketFactory;
        try {
            sslSocketFactory = new TLSSocketFactory();
            HttpsURLConnection.setDefaultSSLSocketFactory(sslSocketFactory);
        } catch (KeyManagementException ignored) {
    
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        }
    }
    







    import java.io.IOException;
    import java.net.InetAddress;
    import java.net.Socket;
    import java.net.UnknownHostException;
    import java.security.KeyManagementException;
    import java.security.NoSuchAlgorithmException;
    
    import javax.net.ssl.SSLContext;
    import javax.net.ssl.SSLSocket;
    import javax.net.ssl.SSLSocketFactory;
    
    /**
     * @author fkrauthan
     * http://blog.dev-area.net/2015/08/13/android-4-1-enable-tls-1-1-and-tls-1-2/
     *
     *
    // IMPORTANT: Pre-lollipop devices do not support SSL TLSv1.1, TLSv1.2
    // so I've included a TLSSocketFactory wrapper class that enables these SSL
    // protocols.
     */
    public class TLSSocketFactory extends SSLSocketFactory {
    
        private SSLSocketFactory internalSSLSocketFactory;
    
        public TLSSocketFactory() throws KeyManagementException, NoSuchAlgorithmException {
            SSLContext context = SSLContext.getInstance("TLS");
            context.init(null, null, null);
            internalSSLSocketFactory = context.getSocketFactory();
        }
    
        @Override
        public String[] getDefaultCipherSuites() {
            return internalSSLSocketFactory.getDefaultCipherSuites();
        }
    
        @Override
        public String[] getSupportedCipherSuites() {
            return internalSSLSocketFactory.getSupportedCipherSuites();
        }
    
        @Override
        public Socket createSocket(Socket s, String host, int port, boolean autoClose) throws IOException {
            return enableTLSOnSocket(internalSSLSocketFactory.createSocket(s, host, port, autoClose));
        }
    
        @Override
        public Socket createSocket(String host, int port) throws IOException, UnknownHostException {
            return enableTLSOnSocket(internalSSLSocketFactory.createSocket(host, port));
        }
    
        @Override
        public Socket createSocket(String host, int port, InetAddress localHost, int localPort) throws IOException, UnknownHostException {
            return enableTLSOnSocket(internalSSLSocketFactory.createSocket(host, port, localHost, localPort));
        }
    
        @Override
        public Socket createSocket(InetAddress host, int port) throws IOException {
            return enableTLSOnSocket(internalSSLSocketFactory.createSocket(host, port));
        }
    
        @Override
        public Socket createSocket(InetAddress address, int port, InetAddress localAddress, int localPort) throws IOException {
            return enableTLSOnSocket(internalSSLSocketFactory.createSocket(address, port, localAddress, localPort));
        }
    
        private Socket enableTLSOnSocket(Socket socket) {
            if(socket != null && (socket instanceof SSLSocket)) {
                ((SSLSocket)socket).setEnabledProtocols(new String[] {"TLSv1.1", "TLSv1.2"});
            }
            return socket;
        }
    }
    

    这篇关于系统调用期间的I / O错误,通过对等方重置连接的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

    查看全文
    相关文章
    登录 关闭
    扫码关注1秒登录
    发送“验证码”获取 | 15天全站免登陆