목차
SocketAddress 클래스와 NetworkInterface 클래스
SocketAddress는 네트워크 끝점을 나타내는 추상 클래스다. IP 주소와 포트 번호가 필요한 TCP/UDP 코드에서는 하위 클래스인 InetSocketAddress를 주로 사용한다. 실제 연결을 수행하는 Socket과 연결 대상의 주소를 나타내는 SocketAddress는 역할이 다르다.
1. InetSocketAddress: 주소와 포트 묶기
import java.net.InetSocketAddress;
import java.net.Socket;
InetSocketAddress endpoint = new InetSocketAddress("example.com", 443);
if (endpoint.isUnresolved()) {
throw new IllegalArgumentException("호스트 이름을 확인할 수 없습니다");
}
try (Socket socket = new Socket()) {
socket.connect(endpoint, 3_000); // 연결 제한 시간: 3초
}
new InetSocketAddress(host, port)는 호스트 이름의 주소 확인을 시도한다. 이름을 확인하지 못한 경우에도 객체가 만들어질 수 있고, isUnresolved()로 그 상태를 확인한다. 반면 InetSocketAddress.createUnresolved(host, port)는 의도적으로 조회를 미룬다. 연결 실패 후 주소 객체에 unresolved 표시가 생기는 것은 아니다. 연결 실패는 Socket 쪽의 예외로 다룬다.
new InetSocketAddress(port)는 모든 로컬 주소를 뜻하는 와일드카드 주소와 포트를 만든다. 서버 소켓을 특정 포트에 바인딩할 때 사용하며, 외부 호스트를 가리키는 방식은 아니다. SocketAddress 자체는 연결을 생성하지 않는다. 자세한 생성자와 상태 규칙은 Java InetSocketAddress API를 참고한다.
2. NetworkInterface: 로컬 네트워크 장치 확인하기
NetworkInterface는 시스템의 물리 또는 가상 네트워크 장치를 나타낸다. 이름, 표시 이름, 연결된 IP 주소, 루프백 여부 등을 조회할 수 있다.
import java.net.InetAddress;
import java.net.NetworkInterface;
import java.net.SocketException;
import java.util.Enumeration;
try {
Enumeration<NetworkInterface> interfaces = NetworkInterface.getNetworkInterfaces();
while (interfaces.hasMoreElements()) {
NetworkInterface device = interfaces.nextElement();
System.out.println(device.getName() + " / " + device.getDisplayName());
for (Enumeration<InetAddress> addresses = device.getInetAddresses();
addresses.hasMoreElements(); ) {
System.out.println(" " + addresses.nextElement().getHostAddress());
}
}
} catch (SocketException e) {
System.err.println("네트워크 장치 목록을 읽지 못했습니다: " + e.getMessage());
}
getByName(name)으로 장치 하나를 찾을 수도 있다. getInterfaceAddresses()는 IP 주소 외에 네트워크 접두 길이 같은 정보가 필요할 때 사용한다. 장치 목록과 IP 할당은 실행 중 바뀔 수 있으므로 조회 결과를 영구적인 네트워크 상태로 가정하지 않는다. Java NetworkInterface API에 메서드와 예외가 정리돼 있다.