我有一个正在侦听特定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握手。这是正常行为吗?
答案 0 :(得分:0)
它们打开的套接字是持久的,在它们从客户端收到CLOSE消息之前不会关闭,即ZERO字节。
您无法在套接字上获得零字节。您要么获得一个或多个字节,要么是流结束,要么是错误(Java中的异常)。这里你的应用程序协议严重错误。
当我重新执行上面的代码,即复制粘贴并尝试按顺序发送一个请求时,我能够重新使用第一次打开的套接字
HttpURLConnection
正在进行连接池化。