Socket
Socket Timeout은 네트워크 통신에서 사용되는 소켓 연결 및 데이터 송수신 작업에 대한 대기 시간을 제어하는 중요한 개념입니다.
일정 시간 내에 어떤 이벤트가 발생하지 않으면 연결 또는 작업을 중단하고 오류를 반환하는 방식으로 동작합니다.
Java에서는 TCP 기반 스트림 소켓으로 클라이언트 측에서는 java.net.Socket 클래스를 사용하고 서버 측 TCP/IP 으로는 java.net.ServerSocket 클래스를 사용합니다.
UDP 작업을 위해서는 java.net.DatagramSocket를 사용합니다.
연결 시간 초과
- 클라이언트가 서버와의 연결을 설정하는데 걸리는 시간을 제한합니다.
- 일정 시간 내에 연결이 설정되지 않으면 ConnectionException이 발생합니다.
발생 이유
- 원격 호스트에서 지정된 포트를 수신하는 서비스가 없습니다.
- 원격 호스트가 연결을 수락하지 않습니다.
- 원격 호스트를 사용할 수 없습니다.
- 느린 인터넷 연결
- 원격 호스트에 대한 전달 경로 없음
해결 방법
클라이언트 측
final int TIMEOUT = 10000;
try(Socket socket = new Socket()) {
SocketAddress socketAddress =new InetSocketAddress(url, port));
clientSocket.connect(socketAddress, TIMEOUT);
} catch (Exception e) {
System.out.println(e.getMessage())
}
TIMEOUT : 시간 초과 단위는 밀리초 이며 0보다 커야 합니다.
- 메소드 호출이 반환되기 전에 시간 초과가 만료되면 SocketTImeoutExcpetion이 발생합니다.
서버 측
final int TIMEOUT = 10000;
ServerSocket serverSocket = new ServerSocket(port);
serverSocket.setSoTimeout(TIMEOUT);
TIMEOUT : 시간 초과 단위는 밀리초 이며 0보다 커야 합니다.
- 소켓이 연결된 후 InputStream에서 읽을 때 timeout을 설정하는 것임으로 socket을 연결할 때 timeout을 주는 것은 InetSocketAddress 클래스를 사용한다.
'Java' 카테고리의 다른 글
Java Executors, ExecutorService (0) | 2024.05.31 |
---|---|
OpenSearch를 사용하면서 발생한 문제 (0) | 2023.11.02 |
[JAVA] GenericObjectPool에 대해 알아보고 사용해보자 (0) | 2023.10.17 |
[Java] try-with-resource (AutoCloseable) (0) | 2023.09.25 |
[Java] - Synchronized (0) | 2023.09.22 |