服务器套接字未关闭

时间:2015-04-10 13:01:02

标签: android ssl sslsocketfactory

我有一个正在侦听特定IP /端口的服务器。它们打开的套接字是持久的,在它们从客户端获得CLOSE消息(即ZERO字节)之前不会关闭。 我的客户端代码如下:

java.net.URL url = new java.net.URL(Constants.URL);
        urlConnection = (HttpsURLConnection) url.openConnection();
        if(WelcomeScreen.mySslContext==null) {
            WelcomeScreen.mySslContext = GetsslContext.getSSLSocketFactory(); //reads the CA certificate and return the getSocketFactory context
        }
        urlConnection.setSSLSocketFactory(WelcomeScreen.mySslContext);
        urlConnection.setReadTimeout(1000*15000);
        urlConnection.setConnectTimeout(1000*20000);
        urlConnection.setDoOutput(true);
        urlConnection.setDoInput(true);
        urlConnection.setUseCaches (false);
        urlConnection.connect();

        //Send Stream on server
        OutputStream outStream = urlConnection.getOutputStream();
        outStream.write(bytes);
        outStream.flush();
        outStream.close();

        //Receive Stream from server
        in = urlConnection.getInputStream();
        in.close();
        urlConnection.disconnect();

执行上述代码后,在我实际退出Android应用程序之前,服务器仍然没有收到CLOSE消息。

请您建议我需要做什么,以便服务器从客户端获取CLOSE消息,以便他们释放与其他客户端的连接?

另一个观察是,当我重新执行上面的代码,即复制粘贴并尝试按顺序发送一个请求时,我能够重新使用第一次打开的套接字。然而,如果我删除条件:

 if(WelcomeScreen.mySslContext==null)

并强制执行代码:

WelcomeScreen.mySslContext = GetsslContext.getSSLSocketFactory(); 

然后它创建一个新的套接字并再次进行SSL握手。这是正常行为吗?

1 个答案:

答案 0 :(得分:0)

  

它们打开的套接字是持久的,在它们从客户端收到CLOSE消息之前不会关闭,即ZERO字节。

您无法在套接字上获得零字节。您要么获得一个或多个字节,要么是流结束,要么是错误(Java中的异常)。这里你的应用程序协议严重错误。

  

当我重新执行上面的代码,即复制粘贴并尝试按顺序发送一个请求时,我能够重新使用第一次打开的套接字

HttpURLConnection正在进行连接池化。