服务器套接字未关闭



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

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();

执行上述代码后,服务器仍然不会收到 CLOSE 消息,直到我实际退出我的 Android 应用程序。

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

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

 if(WelcomeScreen.mySslContext==null)

并强制代码执行:

WelcomeScreen.mySslContext = GetsslContext.getSSLSocketFactory(); 

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

他们

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

不能在套接字上获取零字节。你要么得到一个或多个字节,要么得到流的结尾,要么得到一个错误(Java 中的例外)。您的应用程序协议在这里存在严重问题。

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

这就是执行连接池HttpURLConnection

相关内容

  • 没有找到相关文章

最新更新