我们已成功从带有HTTP网址的网络服务器获取数据近2年而没有任何打嗝。
最近我们出于某些安全原因迁移到了HTTPS。这就是问题发生的时候。
使用WiFi一切正常,当我定期连接到2G口袋数据时,我正在通过服务器问题重置连接。
我正在使用DefaultHttpClient连接到服务器。
我尝试了很多工作,但没有任何事情能够救出我。
我已将所有可用属性应用于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);
另一个谷歌小组的讨论表明,这个问题可能是一个理想的活动状态的原因。所以我实施了这样的事情来保持屏幕清醒。
powerManager = (PowerManager) getSystemService(Context.POWER_SERVICE);
wakeLock = powerManager.newWakeLock(PowerManager.FULL_WAKE_LOCK,"My Tag");
wakeLock.acquire();
在onDestroy()
我用wakeLock.release();
但这也无济于事。
在服务器端还有什么我需要检查的吗?
答案 0 :(得分:5)
我遇到了类似的SSL错误。事实证明,棒棒糖前设备不支持SSL TLSv1.1,TLSv1.2。我通过包含一个启用这些SSL协议的TLSSocketFactory包装类来修复它。 尝试在代码中添加以下内容:
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;
}
}