- Server 종료
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import static util.MyLogger.log;
public class ResetCloseServer {
public static void main(String[] args) throws IOException, InterruptedException {
ServerSocket serverSocket = new ServerSocket(12345);
Socket socket = serverSocket.accept();
log("소캣 연결: " + socket);
socket.close();
serverSocket.close();
log("소캣 종료");
}
}
- Client
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.net.SocketException;
import static util.MyLogger.log;
public class ResetCloseClient {
public static void main(String[] args) throws IOException, InterruptedException {
Socket socket = new Socket("localhost", 12345);
log("소캣 연결: " + socket);
InputStream input = socket.getInputStream();
OutputStream output = socket.getOutputStream();
// client <- server: FIN
Thread.sleep(1000); // 서버가 close() 호출할 때 까지 잠시 대기
// client -> server: PUSH[1]
output.write(1);
// client <- server: RST
Thread.sleep(1000); // RST 메시지 전송 대기
try {
// java.net.SocketException: Connection reset
int read = input.read();
System.out.println("read = " + read);
} catch (SocketException e) {
e.printStackTrace();
}
try {
// java.net.SocketException: Broken pipe
output.write(1);
} catch (SocketException e) {
e.printStackTrace();
}
}
}
- RST 패킷이 도착했다는 것은 현재 TCP 연결에 심각한 문제가 있으므로 해당 연결을 더는 사용하면 안된다는 의미이다.
- RST 패킷이 도착하면 자바는 read()로 메시지를 읽을 때 다음 예외를 던진다.(java.net.SocketException: Connection reset)
- RST 패킷이 도착하면 자바는 write()로 메시지를 전송할 때 다음 예외를 던진다.(java.net.SocketException: Broken pipe)
'개발이 좋아서 > Java가 좋아서' 카테고리의 다른 글
리플렉션 - 클래스와 메타데이터 (0) | 2024.12.01 |
---|---|
HTTP 기본 이론(간단 요약) (1) | 2024.12.01 |
네트워크 예외3 - 정상 종료 (0) | 2024.11.30 |
네트워크 예외2 - 타임아웃 (0) | 2024.11.30 |
네트워크 예외1 - 연결 예외 (1) | 2024.11.30 |