据我了解,延迟是一种设置,允许在关闭最终连接后使连接保持一定的延迟,以便有时间读取最终数据。
我有这个例子:
@Ignore
public class SocketTTest
{
@Test
public void socketTest() throws Throwable
{
new Thread(() -> {
try
{
ServerSocket serverSocket = new ServerSocket(5555);
while(true)
{
//keep listening
Socket socket = serverSocket.accept();
socket.setSoLinger(false, 0);
InputStream in = socket.getInputStream();
System.out.println(in.read());
Thread.sleep(2000);
System.out.println(in.read());
in.close();
socket.close();
System.exit(0);
}
}
catch(Throwable ex)
{
ex.printStackTrace();
}
}).start();
Socket socket = new Socket("localhost", 5555);
socket.setSoLinger(false, 0);
OutputStream out = socket.getOutputStream();
out.write(1);
out.write(2);
out.close();
socket.close();
synchronized(this)
{
wait();
}
}
}
和输出
1
2
如何读取2?延迟功能已禁用,从睡眠状态退出时套接字不应处于无法读取的状态吗?
答案 0 :(得分:4)
setSoLinger()
至false
不会断开此连接吗?
否。
据我了解,延迟是一种设置,允许在关闭最终连接后使连接保持一定的延迟,以便有时间读取最终数据。
不。默认情况下,TCP已经这样做。此设置会导致close()
阻塞指定的超时时间,同时仍有待发送的待处理数据。对其进行设置没有任何意义,并且通过调用setSoLinger(false, 0)
完成的所有代码就是重新声明默认设置。没有它,有无睡眠都可以使您的代码同样正常工作。
SO_LINGER也可以用于通过重置连接来滥用TCP / IP,但是您在这里没有这样做。
如何读取2?
因为TCP不会以这种方式丢失数据。
留守被禁用
是的,但确实如此,请参见上文。
当套接字退出睡眠状态时,它应该不会处于无法读取的状态吗?
我不知道这意味着什么。您是在矛盾自己,还是在这里无意中出现了双重否定。