Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java HttpsURLConnection、EOFEException和http.keepAlive_Java_Android_Https - Fatal编程技术网

Java HttpsURLConnection、EOFEException和http.keepAlive

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

我正在使用HttpsURLConnection连接到我们的服务器,以便使用post方法获取数据。我面临的问题是,我不时收到
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
的情况下,“再次检索代码”没有意义。简言之,你的代码都没有意义恩,所以它不起作用也就不足为奇了。哎哟,疼死了;)。谢谢你的回复,我将尝试重新构建代码。