不应该将 SoLinger 设置为错误地切断此连接吗?
Shouldn't set SoLinger to false cut this connection?
据我了解,linger 是一种设置,允许在关闭后保持连接一些延迟,以便有时间读取最终数据。
我有这个例子:
@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怎么读?延迟被禁用,套接字在从睡眠中苏醒时不应该处于不可读状态?
Shouldn't setSoLinger()
to false
cut this connection?
没有
From what I understand, linger is a setting allowing to keep the connection some delay after close for the final data to have time to be read.
没有。默认情况下,TCP 已经这样做了。该设置会导致 close()
在仍有未决数据等待发送时阻塞指定的超时时间。设置它没有什么意义,您的代码通过调用 setSoLinger(false, 0)
完成的所有工作就是重新声明默认设置。没有它,无论有没有睡眠,您的代码都可以正常工作。
SO_LINGER 也可以通过重置连接来滥用 TCP/IP,但您不会在这里这样做。
How the 2 is read?
因为 TCP 不会以这种方式丢失数据。
The linger is disabled
是的,但它已经是,见上文。
the socket shouldn't be in an unreadable state when it comes out of sleep?
我不知道这是什么意思。要么你在自相矛盾,要么这里有一个无意的双重否定。
据我了解,linger 是一种设置,允许在关闭后保持连接一些延迟,以便有时间读取最终数据。
我有这个例子:
@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怎么读?延迟被禁用,套接字在从睡眠中苏醒时不应该处于不可读状态?
Shouldn't
setSoLinger()
tofalse
cut this connection?
没有
From what I understand, linger is a setting allowing to keep the connection some delay after close for the final data to have time to be read.
没有。默认情况下,TCP 已经这样做了。该设置会导致 close()
在仍有未决数据等待发送时阻塞指定的超时时间。设置它没有什么意义,您的代码通过调用 setSoLinger(false, 0)
完成的所有工作就是重新声明默认设置。没有它,无论有没有睡眠,您的代码都可以正常工作。
SO_LINGER 也可以通过重置连接来滥用 TCP/IP,但您不会在这里这样做。
How the 2 is read?
因为 TCP 不会以这种方式丢失数据。
The linger is disabled
是的,但它已经是,见上文。
the socket shouldn't be in an unreadable state when it comes out of sleep?
我不知道这是什么意思。要么你在自相矛盾,要么这里有一个无意的双重否定。