我想知道为什么我的服务器应用程序在收到服务器发送的数据的客户端应用程序之前已经终止的情况下没有得到SocketException。捕获网络流量清楚地表明客户端发送的FIN数据包由服务器回答ACK数据包(1312是此处的服务器端口):
CURLOPT_SSL_VERIFYHOST
因此,服务器应该知道客户端已将其部分流关闭到服务器,并且不再读取任何数据。但是,当服务器应用程序正在读取或写入其ServerSocket时,它不会获得SocketException。
客户端:
Info
54434→1312 [SYN] Seq=0 Win=14600 Len=0 MSS=1460 SACK_PERM=1 TSval=887691835 TSecr=0 WS=128
1312→54434 [SYN, ACK] Seq=0 Ack=1 Win=8192 Len=0 MSS=1460 WS=256 SACK_PERM=1 TSval=2651623 TSecr=887691835
54434→1312 [ACK] Seq=1 Ack=1 Win=14720 Len=0 TSval=887691835 TSecr=2651623
54434→1312 [PSH, ACK] Seq=1 Ack=1 Win=14720 Len=12 TSval=887691836 TSecr=2651623
1312→54434 [ACK] Seq=1 Ack=13 Win=66560 Len=0 TSval=2651645 TSecr=887691836
54434→1312 [FIN, ACK] Seq=13 Ack=1 Win=14720 Len=0 TSval=887693987 TSecr=2651645
1312→54434 [ACK] Seq=1 Ack=14 Win=66560 Len=0 TSval=2651839 TSecr=887693987
1312→54434 [PSH, ACK] Seq=1 Ack=14 Win=66560 Len=3 TSval=2657624 TSecr=887693987
54434→1312 [RST] Seq=14 Win=0 Len=0
服务器:
try (Socket socket = new Socket(Util.getHost(), Util.getPort());
PrintWriter writer = new PrintWriter(socket.getOutputStream(), true)) {
String cmd = "sleep:" + sleepMillisToSend + "\n";
writer.write(cmd);
writer.flush();
LOGGER.info("Terminated.");
} catch (IOException e) {
LOGGER.log(Level.SEVERE, e.getMessage(), e);
}