Java TCP SSL套接字-服务器如何让我等待?

Java TCP SSL套接字-服务器如何让我等待?,java,sockets,tcp,inputstream,readline,Java,Sockets,Tcp,Inputstream,Readline,我正在编写自己的客户机,以便使用一些不常见的协议与现有服务器通信。 该协议基本上是通过TLS 1.2 TCP套接字发送和接收XML块。 它描述了相当长的会话。有时,客户机和服务器会连续数周发送和接收XML,而不会断开连接 我不明白我的客户端是如何耐心地等待东西被发送的,即使服务器没有发送 当连接到服务器时,我得到如下信息: <mainTag> <greeting> </greeting> (notice: no </mainTag>) 特别是,在

我正在编写自己的客户机,以便使用一些不常见的协议与现有服务器通信。 该协议基本上是通过TLS 1.2 TCP套接字发送和接收XML块。 它描述了相当长的会话。有时,客户机和服务器会连续数周发送和接收XML,而不会断开连接

我不明白我的客户端是如何耐心地等待东西被发送的,即使服务器没有发送

当连接到服务器时,我得到如下信息:

<mainTag>
<greeting>
</greeting>
(notice: no </mainTag>)
特别是,在调试过程中,我进入:
while((inputLine=In.readLine())!=null)
并且我到达
,但是当我再次进入时,我可以看到它就挂在那里

.readLine()
是否返回某些内容?如果是,为什么不打印?

或者,它没有返回什么?如果是这样,为什么
.readLine()
null不为空?

这就是阻塞I/O的工作原理。线程只是等待接收输入(在本例中,某些文本以任何换行符结尾)或直到抛出异常。你需要提供服务器代码来诊断为什么没有发送最后一个结束标记。是的,我刚才想到了这个。当我仔细观察时,我可以看到服务器也在发送要读取的字节数。太尴尬了。我讨厌愚蠢,我也讨厌愚蠢。这只是我们学会生活的东西。。。偶尔在:)这就是阻塞I/O的工作原理。线程只是等待接收输入(在本例中,某些文本以任何换行符结尾)或直到抛出异常。你需要提供服务器代码来诊断为什么没有发送最后一个结束标记。是的,我刚才想到了这个。当我仔细观察时,我可以看到服务器也在发送要读取的字节数。太尴尬了。我讨厌愚蠢,我也讨厌愚蠢。这只是我们学会生活的东西。。。偶尔也会在:)
try (
    SSLSocket socket = getSSLsocket(keystoreFile, keystorePass, keystorePass);
        // ... Write-stuff removed, irrelevant to the question ...
    BufferedReader in = new BufferedReader(
            new InputStreamReader(
                    socket.getInputStream()));
    ) {
        socket.startHandshake();
        // ... Write-stuff removed, irrelevant to the question ...
        String inputLine;
        while ((inputLine = in.readLine()) != null)
            System.out.println(inputLine);
    }
}

private static SSLSocket getSSLsocket (String ksPath, String ksPass, String pkPass) {
    SSLContext context = SSLContext.getInstance("TLS");
        // ... Some key management stuff removed ...
    SSLSocketFactory sslScktFactory = context.getSocketFactory();
    return (SSLSocket)sslScktFactory.createSocket(hostFQDN, port);
}