我正在尝试在我的本地计算机上试用SSLServerSocket程序 - (该程序旨在使用基于单个参数的普通套接字或SSL套接字到服务器对象的构造函数)。在普通数据中,程序完全按预期工作,但使用SSL:
socket.getInputStream().read();
即使远程端关闭,也始终返回65535(即0xFFFF)。知道什么是错的吗?如果有帮助,我可以发布代码。
提前致谢
编辑:好的,现在我醒了 - 正如下面的人正确指出的那样,它的'断开'排序(isClosed仍然返回false等,但输入流只有-1)。
查看SSL的调试信息,我注意到了这个gem:
***
pool-2-thread-1, WRITE: TLSv1.1 Handshake, length = 36
%% Cached server session: [Session-3, TLS_ECDHE_RSA_WITH_RC4_128_SHA]
pool-2-thread-1, received EOFException: ignored
pool-2-thread-1, called closeInternal(false)
pool-2-thread-1, SEND TLSv1.1 ALERT: warning, description = close_notify
pool-2-thread-1, WRITE: TLSv1.1 Alert, length = 22
pool-2-thread-1, called closeSocket(selfInitiated)
After use
来自代码:
final SSLSocket socket = (SSLSocket) ((SSLServerSocket)_ServerSocket).accept();
System.out.println("Before use");
socket.getInputStream().read();
System.out.println("After use");
所以,我想 - 客户端(在这种情况下,浏览器)挂起而没有正确地说'再见'。
鉴于我的预期用途是SSL / TLS上的websocket(wss:// localhost:/),我尝试添加证书设置并将其添加到Windows 7的可信证书中,但它似乎仍然不想要工作(html文件在我的本地系统上,连接到上面的wss:URL,所以keygen.exe的服务器别名是localhost吗?)。
还知道我哪里出错吗?
答案 0 :(得分:0)
你错了。 read()永远不会返回0xFFFF。但是,当对等体关闭时,它返回 -1 (0xFFFFFFFF)。见Javadoc。您需要将结果存储在int中,而不是字节中,因此您可以将-1表示EOS与0xFF区分为数据字节。