我有一台正在侦听特定 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();
执行上述代码后,在我真正退出我的 Android 应用程序之前,服务器仍然不会收到 CLOSE 消息。
您能否建议我需要做什么,以便服务器从客户端获取 CLOSE 消息,以便他们释放与其他客户端的连接?
另一个观察结果是,当我重新执行上述代码(即复制粘贴)并尝试按顺序再发送一个请求时,我能够重新使用第一次打开的套接字。然而,如果我删除条件:
if(WelcomeScreen.mySslContext==null)
并强制执行代码:
WelcomeScreen.mySslContext = GetsslContext.getSSLSocketFactory();
然后它会创建一个新的套接字并再次进行 SSL 握手。这是正常行为吗?