我有一台服务器正在侦听特定的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
。