Java HttpsURLConnection、EOFEException和http.keepAlive
我正在使用HttpsURLConnection连接到我们的服务器,以便使用post方法获取数据。我面临的问题是,我不时收到Java HttpsURLConnection、EOFEException和http.keepAlive,java,android,https,Java,Android,Https,我正在使用HttpsURLConnection连接到我们的服务器,以便使用post方法获取数据。我面临的问题是,我不时收到EOFEException 我做了一些研究,并尝试使用例如connection.setRequestProperty(“connection”、“close”)但是当我在其他属性中设置此属性时,我无法连接到服务器,始终收到此错误java.net.SocketException:Socket已关闭 现在我正试图使用System.setProperty(“http.keepAli
EOFEException
我做了一些研究,并尝试使用例如connection.setRequestProperty(“connection”、“close”)
但是当我在其他属性中设置此属性时,我无法连接到服务器,始终收到此错误java.net.SocketException:Socket已关闭
现在我正试图使用System.setProperty(“http.keepAlive”、“false”)来解决这个问题代码>但我不完全确定必须在何处设置此属性。我在连接到服务器的方法的开头设置它
这里是我的代码中最相关的部分:
HttpsURLConnection conn = null;
RESTResponse response = null;
int status = -1;
try {
List<NameValuePair> params = request.getParameters();
String uri = request.getRequestUri().toString();
if (request.getMethod() == RESTMethods.GET) {
if (params != null) {
uri += "?";
boolean first_param = true;
for (NameValuePair p : params) {
if (first_param)
first_param = false;
else
uri += "&";
uri += p.getName() + "="
+ URLEncoder.encode(p.getValue(), "UTF-8");
}
}
}
Security.addProvider(new BouncyCastleProvider());
char[] passphrase = "mypass".toCharArray();
try {
KeyStore ksTrust = KeyStore.getInstance("BKS");
ksTrust.load(context.getResources().openRawResource(R.raw.mystore),passphrase);
TrustManagerFactory tmf = TrustManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
tmf.init(ksTrust);
// Create a SSLContext with the certificate
SSLContext sslContext = SSLContext.getInstance("TLS");
sslContext.init(null, tmf.getTrustManagers(), new SecureRandom());
Log.v(TAG,"URI = " + uri);
URL url = new URL(uri);
conn = (HttpsURLConnection) url.openConnection();
conn.setSSLSocketFactory(sslContext.getSocketFactory());
conn.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (CertificateException e) {
e.printStackTrace();
} catch (NotFoundException e) {
e.printStackTrace();
} catch (KeyStoreException e) {
e.printStackTrace();
} catch (KeyManagementException e) {
e.printStackTrace();
}
if (request.getHeaders() != null) {
for (String header : request.getHeaders().keySet()) {
for (String value : request.getHeaders().get(header)) {
conn.addRequestProperty(header, value);
}
}
}
switch (request.getMethod()) {
case GET:
conn.setDoOutput(false);
break;
case POST:
conn.setDoOutput(true);
conn.setDoInput(true);
conn.setRequestMethod("POST");
conn.setRequestProperty("Content-Type",
"application/x-www-form-urlencoded");
conn.setRequestProperty("charset", "utf-8");
conn.setRequestProperty("Connection", "close"); // disables connection reuse but getting ERROR
DataOutputStream wr = new DataOutputStream(conn.getOutputStream());
wr.writeBytes(getQuery(params));
wr.flush();
wr.close();
default:
break;
}
try {
conn.connect();
status = conn.getResponseCode(); //Receiving EOFException when Connection close not set
} catch (IOException ex1) {
//check if it's eof, if yes retrieve code again
ex1.printStackTrace();
// handle exception
}
HttpsURLConnection conn=null;
response response=null;
int status=-1;
试一试{
List params=request.getParameters();
字符串uri=request.getRequestUri().toString();
if(request.getMethod()==RESTMethods.GET){
如果(参数!=null){
uri+=“?”;
布尔第一参数=真;
用于(名称值对p:params){
如果(第一个参数)
第一个参数=假;
其他的
uri+=“&”;
uri+=p.getName()+“=”
+encode(p.getValue(),“UTF-8”);
}
}
}
addProvider(新的BouncyCastleProvider());
char[]passphrase=“mypass.toCharArray();
试一试{
KeyStore ksTrust=KeyStore.getInstance(“BKS”);
load(context.getResources().openrawsource(R.raw.mystore),密码短语);
TrustManagerFactory tmf=TrustManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
tmf.init(ksTrust);
//使用证书创建SSLContext
SSLContext SSLContext=SSLContext.getInstance(“TLS”);
init(null,tmf.getTrustManagers(),new SecureRandom());
Log.v(标记,“URI=”+URI);
URL=新的URL(uri);
conn=(HttpsURLConnection)url.openConnection();
conn.setsslssocketfactory(sslContext.getSocketFactory());
conn.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
}捕获(无算法异常){
e、 printStackTrace();
}捕获(证书例外e){
e、 printStackTrace();
}捕获(未发现异常){
e、 printStackTrace();
}捕获(KeyStoreException e){
e、 printStackTrace();
}捕获(密钥管理异常e){
e、 printStackTrace();
}
if(request.getHeaders()!=null){
for(字符串头:request.getHeaders().keySet()){
for(字符串值:request.getHeaders().get(header)){
conn.addRequestProperty(头,值);
}
}
}
开关(request.getMethod()){
案例获取:
连接设置输出(假);
打破
个案职位:
连接设置输出(真);
conn.setDoInput(真);
conn.setRequestMethod(“POST”);
conn.setRequestProperty(“内容类型”,
“application/x-www-form-urlencoded”);
conn.setRequestProperty(“字符集”、“utf-8”);
conn.setRequestProperty(“连接”,“关闭”);//禁用连接重用,但获取错误
DataOutputStream wr=新的DataOutputStream(conn.getOutputStream());
writeBytes(getQuery(params));
wr.flush();
wr.close();
违约:
打破
}
试试{
连接();
status=conn.getResponseCode();//未设置连接关闭时接收EOFEException
}捕获(IOException ex1){
//检查是否为eof,如果是,再次检索代码
ex1.printStackTrace();
//处理异常
}
提前感谢!试试这1。conn.setDoOutput(false)
是GET的默认值,而conn.setDoOutput(true)
是PUT的默认值。conn.setDoInput(true)
是两者的默认值。application/x-www-form-urlencoded"
是PUT的默认设置。2.强制服务器关闭连接不会解决EOFException
。你弄错了树。3.在连接之前写入输出没有意义。4.在发生EOFException
的情况下,“再次检索代码”没有意义。简言之,你的代码都没有意义恩,所以它不起作用也就不足为奇了。哎哟,疼死了;)。谢谢你的回复,我将尝试重新构建代码。