네트워크
레퍼런스 코드를 쭈욱 쳐보면서 느낌을 잡아보자
서버 / 클라이언트 두개로..
Server
public class ExampleNetworkServer {
public static void main (String[] args) throws IOException {
System.out.println("서버 : 대기");
ServerSocket serverSocket = new ServerSocket(9999);
Socket socket = serverSocket.accept();
System.out.println("서버 : 시작");
InetAddress inetAddr = socket.getInetAddress();
System.out.println("접속쪽의 IP 어드레스 : " + inetAddr.getHostAddress());
socket.close();
serverSocket.close();
System.out.println("처리종료");
}
}
이놈을 실행시켜 놓고
Client
public class ExampleNetworkClient {
public static void main (String[] args) throws IOException {
System.out.println("접속 시작");
Socket socket = new Socket("localhost", 9999);
InetAddress inetAddr = socket.getInetAddress();
System.out.println("접속하는곳의 IP 어드레스 : " + inetAddr.getHostAddress());
socket.close();
System.out.println("처리종료");
}
}
접속 시작
접속하는곳의 IP 어드레스 : 127.0.0.1
처리종료
서버쪽을 실행안하고 클라이언트만 실행해보면
이런식으로 익셉션이 발생한다
접속 시작
Exception in thread "main" java.net.ConnectException: 연결이 거부됨
at java.base/sun.nio.ch.Net.connect0(Native Method)
at java.base/sun.nio.ch.Net.connect(Net.java:579)
at java.base/sun.nio.ch.Net.connect(Net.java:568)
at java.base/sun.nio.ch.NioSocketImpl.connect(NioSocketImpl.java:588)
at java.base/java.net.SocksSocketImpl.connect(SocksSocketImpl.java:327)
at java.base/java.net.Socket.connect(Socket.java:633)
at java.base/java.net.Socket.connect(Socket.java:583)
at java.base/java.net.Socket.<init>(Socket.java:507)
at java.base/java.net.Socket.<init>(Socket.java:287)
at org.example.ExampleNetwork2.main(ExampleNetworkClient.java:13)
호스트 이름을 통해서 ip어드레스로 변환
public class Resolver {
public static void main(String[] args) throws UnknownHostException {
String hostName = "localhost";
InetAddress inetAddr = InetAddress.getByName(hostName);
System.out.println(hostName + " 의 IP어드레스 : " + inetAddr.getHostAddress());
}
}
localhost 의 IP어드레스 : 127.0.0.1
호스트명이 제대로 안되거나 하면 UnknownHostException 이 발생한다
Exception in thread "main" java.net.UnknownHostException: localhost1: 이름 혹은 서비스를 알 수 없습니다
at java.base/java.net.Inet6AddressImpl.lookupAllHostAddr(Native Method)
at java.base/java.net.InetAddress$PlatformNameService.lookupAllHostAddr(InetAddress.java:933)
at java.base/java.net.InetAddress.getAddressesFromNameService(InetAddress.java:1519)
at java.base/java.net.InetAddress$NameServiceAddresses.get(InetAddress.java:852)
at java.base/java.net.InetAddress.getAllByName0(InetAddress.java:1509)
at java.base/java.net.InetAddress.getAllByName(InetAddress.java:1367)
at java.base/java.net.InetAddress.getAllByName(InetAddress.java:1301)
at java.base/java.net.InetAddress.getByName(InetAddress.java:1251)
at org.example.Resolver.main(Resolver.java:11)
null 을 파라미터로 넣으면 ??
public class Resolver {
public static void main(String[] args) throws UnknownHostException {
String hostName = "localhost1";
InetAddress inetAddr = InetAddress.getByName(null); // 이렇게 null파라미터를 넣으면 127.0.0.1 !!
System.out.println(hostName + " 의 IP어드레스 : " + inetAddr.getHostAddress());
}
}
localhost1 의 IP어드레스 : 127.0.0.1
null 을 파라미터로 넣었을 경우에는 127.0.0.1 을 반환한다
IP어드레스를 호스트 명으로 변환
public class ReverseResolver {
public static void main(String[] args) throws UnknownHostException {
byte[] ipAddr = {127, 0, 0, 1};
InetAddress inetAddr = InetAddress.getByAddress(ipAddr);
System.out.println("127.0.0.1 의 호스트명은 : " + inetAddr.getHostName());
}
}
127.0.0.1 의 호스트명은 : localhost
중요한 포인트는 IP 어드레스는 각 자리가 0 ~ 255 이다
즉 최대 255.255.255.255 라는것.
근데 byte형은 -128 ~ 127 이 범위이다
그러므로 128이상의 숫자값이 들어가는 주소이면 byte 형으로 형변환을 해줘야 한다