如何在Java中确定服务器是否已关闭连接(接收到RST数据包)?
我正在使用套接字类进行TCP连接。但我目前的问题是确定确切的原因。 在这两种情况下(如果存在连接超时或服务器关闭连接),我都会收到带有“断管”消息的SocketException。那么我如何才能准确地确定断开连接的原因呢如何在Java中确定服务器是否已关闭连接(接收到RST数据包)?,java,sockets,tcp,Java,Sockets,Tcp,我正在使用套接字类进行TCP连接。但我目前的问题是确定确切的原因。 在这两种情况下(如果存在连接超时或服务器关闭连接),我都会收到带有“断管”消息的SocketException。那么我如何才能准确地确定断开连接的原因呢 谢谢 我认为应该抛出一个不同的异常。如果您正在谈论连接,那么您应该从主机获得一个SocketException,该主机发送一个重置(我认为这是RST数据包)和一个SocketTimeoutException,如果您的连接超时 如果您再次谈论IO,如果服务器断开连接,您将得到一个
谢谢 我认为应该抛出一个不同的
异常。如果您正在谈论连接,那么您应该从主机获得一个SocketException
,该主机发送一个重置(我认为这是RST
数据包)和一个SocketTimeoutException
,如果您的连接超时
如果您再次谈论IO,如果服务器断开连接,您将得到一个SocketException
,而如果IO超时(可能只是读取),您将得到一个SocketTimeoutException
这是我使用的测试程序。我当然在疯狂地流血
try {
new Socket().connect(new InetSocketAddress(someIpThatHangs, 8000), 1000);
fail("Should have thrown");
} catch (SocketTimeoutException e) {
// we expected it to timeout
}
try {
new Socket().connect(new InetSocketAddress(someIpThatResets, 1000));
fail("Should have thrown");
} catch (SocketException e) {
// we expected it to throw an exception immediately on reset
}
// start our server
final ServerSocket serverSocket = new ServerSocket();
int serverPort = 8000;
InetSocketAddress address = new InetSocketAddress("127.0.0.1", serverPort);
serverSocket.bind(address);
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
while (!Thread.currentThread().isInterrupted()) {
try {
Socket clientSocket = serverSocket.accept();
System.err.println("Got a connection");
Thread.sleep(1000);
clientSocket.close();
} catch (InterruptedException e) {
return;
} catch (Exception e) {
e.printStackTrace();
return;
}
}
}
});
thread.start();
// wait for the server to start
Thread.sleep(100);
Socket clientSocket = new Socket();
clientSocket.connect(address);
try {
// read until the server closes the connection
clientSocket.getInputStream().read();
} catch (SocketException e) {
// expected socket exception
}
clientSocket = new Socket();
clientSocket.connect(address);
clientSocket.setSoTimeout(100);
try {
// read until the socket timeout expires
clientSocket.getInputStream().read();
} catch (SocketTimeoutException e) {
// expected read timeout exception
}
serverSocket.close();
thread.interrupt();
嗯,有一个小问题:SocketTimeoutException发生,即使我们没有通过读取操作收到任何信息。换句话说,SocketTimeoutException并不能保证连接丢失——它只是说我们得到了读取或接受命令的超时,并且在这段时间内没有收到任何东西(在你们的情况下是100毫秒)。对不起,伙计们,不是RST数据包,而是FIN标志!与及