●IP주소 : 네트워크주소(3자리) + 호스트주소(1자리)

 - IPv4 (a.b.c.d) : 4byte(32bit)로 각 자리는 1byte(8bit)로써 0~255 정수 범위, IP주소&서브넷마스트 = 네트워크주소

  IP주소 : 192.168.10.90

  서브넷마스크 : 255.255.255.0 

  네트워크주소 : 192.168.10.0

   ->네트워크주소가 같은 호스트들은 같은 네트워크를 사용함

   ->호스트주소가 0: 네트워크 자신, 255: 브로드캐스트 주소 –> 254개의 호스트 연결가능

 - IPv6 (ac:d:e:f:g:h) : 128bit = 16bit씩 8자리

●InetAddress 클래스 : IP주소를 다루기 위한 클래스

public static void main(String[] args) throws IOException {
		InetAddress ip = InetAddress.getByName("www.google.com");
		System.out.println("hostname : " + ip.getHostName());		// 호스트이름
		System.out.println("hostaddress : " + ip.getHostAddress()); 	// 호스트주소
		
		InetAddress[] ips = InetAddress.getAllByName("www.google.com");
		for (InetAddress i : ips) {
			System.out.println("ip 주소 : " + i);
		}	
		
		InetAddress local = InetAddress.getLocalHost();
		System.out.println("내컴퓨터 : " + local);
	}

●URL (Uniform Resource Locator)

 - 프로토콜://호스트명:포트번호/경로명/파일명?쿼리#참조

public static void main(String[] args) throws Exception {
		URL url = new URL("https://news.naver.com/main/read.nhn?mode=LSD&mid=shm&sid1=101&oid=011&aid=0003753620");
		
		System.out.println("url.getAuthority() : " + url.getAuthority());
		System.out.println("url.getContent() : " + url.getContent());
		System.out.println("url.getDefaultPort() : " + url.getDefaultPort());
		System.out.println("url.getPort() : " + url.getPort());
		System.out.println("url.getFile() : " + url.getFile());
		System.out.println("url.getHost() : " + url.getHost());
		System.out.println("url.getPath() : " + url.getPath());
		System.out.println("url.getProtocol() : " + url.getProtocol());
		System.out.println("url.getQuery() : " + url.getQuery());
		System.out.println("url.getRef() : " + url.getRef());
		System.out.println("url.getUserInfo() : " + url.getUserInfo());
		System.out.println("url.toExternalForm() : " + url.toExternalForm());
		System.out.println("url.toURI() : " + url.toURI());
	}

●TCP/IP 프로토콜

 - 연결기반(1:1), 신뢰성 있는 데이터 전송

 - 클라이언트의 OutputStream -> 서버의 InputStream 연결

 - 서버의 OutputStream -> 클라이언트의 InputStream 연결

 - 구현할때 보통 간단한 Client -> 복잡한 Server 순서

 - localhost : 127.0.0.1

☆:클라이언트 / ★:서버

1. server 실행(main) ★

2. ServerSocket serverSocket = new ServerSocket(7777); -> 포트번호 7777로 서버소켓 오픈  ★

3. Socket socket = new Socket(“127.0.0.1”, 7777); -> 클라이언트가 서버소켓으로 연결요청  ☆

4. Socket socket = serverSocket.accept(); -> 클라이언트의 연결을 수락해 서버에 새로운 소켓 생성 후 client와 연결  ★

5. OutputStream out = socket.getOutputStream(); / InputStream in = socket.getInputStream()  ★☆

    -> 입출력을 위한 입력스트림,출력스트림을 클라이언트와 서버에 구현  

6. socket.close() & stream.close() -> 입출력스트림 사용 후 닫음  ★☆

package ch16;

public class TcpIpServer {

	public static void main(String[] args) {
		ServerSocket serverSocket = null;
		try {
			serverSocket = new ServerSocket(7777);
			System.out.println("서버가 준비되었습니다.");
		} catch (IOException e) {
			e.printStackTrace();
		}
		
		while (true) {
			try {
				Socket socket = serverSocket.accept();
				System.out.println(socket.getInetAddress() + "로부터 연결요청이 들어왔습니다.");
                
				OutputStream out = socket.getOutputStream();
				DataOutputStream dos = new DataOutputStream(out);
//				DataOutputStream out = new DateOutputStream(socket.getOutputStream());
				InputStream in = socket.getInputStream();
				DataInputStream dis = new DataInputStream(in);
//				DataInputStream in = new DataInputStream(socket.getInputStream));
				
				dos.writeUTF(getTime() + "접속을 환영합니다.");
				
				dos.close(); out.close();
				dis.close(); in.close();
				socket.close();
				
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}
public class TcpIpClient {

	public static void main(String[] args) {
		String serverIp = "127.0.0.1";
		int port = 7777;

		System.out.println("서버에 연결중입니다. 서버IP : " + serverIp);
		Socket socket;
		try {
			socket = new Socket(serverIp, port);

			OutputStream out = socket.getOutputStream();
			DataOutputStream dos = new DataOutputStream(out);
//			DataOutputStream out = new DateOutputStream(socket.getOutputStream());
			InputStream in = socket.getInputStream();
			DataInputStream dis = new DataInputStream(in);
//			DataInputStream in = new DataInputStream(socket.getInputStream));

			System.out.println("서버로부터 받은 메시지 : " + dis.readUTF());
			System.out.println("연결을 종료합니다.");

			dos.close(); out.close();
			dis.close(); in.close();
			socket.close();
		} catch (IOException e) {
			e.printStackTrace();
		}

	}

}