JAVA(Sol)(정리대기중..언젠가)

210428_1~4(네트워크,사설ip/ 공인ip , 서버,클라이언트)

너굴셉 2021. 4. 28. 10:16

210428_1

사설ip/ 공인ip

 

사설 ip : ip번호의 부족으로 서브넷에서만 특정 ip대역을 중복허락한다.

            ex)[ A ] 192.163.10.123 [ B ] 192.163.10.123

            다른 네트워크에서 같은 ip가 존재 할 수 있는 번호

 

공인 ip : 모든 네트워크를 통틀어서 유일한 IP --서버

사설 ip : 서브넷에서만 유일한 IP-- 192.168.xxx.xxx  172.10.xxx.xxx  10.xxx.xxx.xxx

 

고정 ip : 항상번호가 같은 IP -- 서버

동적 IP : 가끔 번호가 바뀌는 IP

 

서버 ===> 공인 + 고정

학원 ===> 사설 + 고정

   집 ===> 공인 + 유동->공유기-->(사설 + 유동) <=== DHCP서버(공유기의역할)

 

공인 IP 사설 IP
고정 IP 유동IP

 


net

 

Local : 사용자가 로그인한 컴퓨터

remote : local을 제외한 net으로 연결되어있는 컴퓨터

package chapter21;
//package.java.net.*(network기초이론, ServerSocket,Socket)

import java.net.*;

class AddressTest {

	public static void main(String[] args) throws UnknownHostException {
		InetAddress address = InetAddress.getLocalHost();
		//인터넷 객체만들기 암기(도메인주소가뭐냐~) //getLocalHost정보를가져와라
		System.out.println("로컬 컴퓨터의 이름 :" + address.getHostName());
		//getHostName() 호스트컴퓨터의이름
		System.out.println("로컬 컴퓨터의 IP주소 : " + address.getHostAddress());
		//getHostAddress() 호스트컴퓨터의 ip주소
		address = InetAddress.getByName("java.sun.com");
		// getByname도메인이름(java.sun.com)과 ip주소를 얻어온다
		System.out.println("java.sun.com 도메인 이름과 IP주소 :" + address);
		

		InetAddress SW[] = InetAddress.getAllByName("naver.com");
		// getAllByName("도메인") 모든 DNS서버주소를 얻어와라
		for (int i = 0; i < SW.length; i++) {
			System.out.println(SW[i]);
		}

	}

}
package chapter21;

import java.net.*;

public class LookupHost {

	public static void main(String[] args) {
		String arg_ip = "192.168.0.81"; //local ip 넣기

		try {

			InetAddress inetAddr = InetAddress.getByName(arg_ip);
			//ip를 넣고 이름을 얻어올수있다
			String name = inetAddr.getHostName() + "\n";
			//ip에 연결된 호스트컴퓨터의 이름얻어오기
			String ip = inetAddr.getHostAddress() + "\n";
			//ip주소 얻어오기
			System.out.println("Host Name : " + name);
			
			System.out.println("IP Address : " + ip);
		} catch (Exception e) {
			System.out.println(e.toString());
		}
	}

}

host : 접대 요청을 받는 컴퓨터, 즉 클라이언트 입장에서는 서버를 말한다.

client : 고객 컴퓨터, 요청하는 컴퓨터


server와 client 

 

소켓 : Socket : 두 응용 프로그램 사이에서 통신을 가능하게하는 툴이다.

 

  [ 서버 응용 ] >--소켓--<------통신------->--소켓--< [ 클라이언트 ]

 

소켓통신원리

작동순서

서버 <망연결> 클라이언트
1) 서버소켓    
2) 포트감시 <-------------접속시도-----3) 소켓(서버ip,포트)
4) 소켓생성
 (클라이언트정보)
   
5) 출력객체-
  [ 버퍼저장 ]
-------------flush-----------> 입력객체 - [ 버퍼저장]

 서버가 먼저 실행해서 1) 2) 상태가 진행되어야 한다. -3)접속시도 -4)소켓생성 -5)출력개체

package chapter21;

import java.io.*;
import java.net.*;

public class TestServer {

	public static void main(String[] args) {
		System.out.println("왕눈이 서버 프로그램 작동됨");

		ServerSocket server = null; // 서버소켓 변수 server선언
		try {
			server = new ServerSocket(2006); // 포트번호 2006번 감시
			while (true) { // 무한루프 
				System.out.println("클라이언트 접속을 대기중입니다.");
				Socket client = server.accept(); 
				// 루프가멈춰있음 접속을기다리는상태 //접속을하면 client가만들어짐
				InetAddress ia = client.getInetAddress();
				String name = ia.getHostName() + "\n";
				String ip = ia.getHostAddress() + "\n";

				System.out.println("클라이언트 접속됨...." + "name:" + name + "ip:" + ip);
				//클라이언트의 InetAddress로 이름과 아이피주소를 얻어와서 출력

				BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(client.getOutputStream()));
				//클라이언트에게 나가는데이터를잡아서 문자열로바꾼다음에 출력버퍼에넣고 그것을writer라는객체에저장 //출력객체생성법
				writer.write("어서오세요오오~"); // 출력버퍼에 내용을 전달
				writer.flush(); // flush() 클라이언트에게 내용전송
				
				
				try {
					client.close(); //연결끊음 //close에 throw절이 붙어있어서 try절사용
				} catch (IOException e) {
					System.out.println("ServerSocket을 닫응중 에러가 났습니다." + e.toString());
				} //루프가 안끝나서 대기상태로 돌아간다. 
				//아래코드가 죽은코드가됨..break가 없어서
			}
		} catch (IOException e) {
			System.out.println("Exception generated...");
		} finally {
			try {
				server.close();
				System.out.println("서버 작동을 종료합니다.");
			} catch (IOException e) {
				System.out.println("ServerSocket을 닫는중 에러가 났습니다." + e.toString());
			}
		}
		InputStream is = System.in; //콘솔에 입력된데이터를 읽어라 is
		try {
			is.read(); //프로그램이 메모리에서 내려올것을 잠시대기
		} catch (Exception e) {
			System.out.println("서버프로그램 실행을 종료합니다.");
		}
	}

}
//왕눈이 서버 프로그램 작동됨
//클라이언트 접속을 대기중입니다.
//클라이언트 접속됨....name:DESKTOP-1IKG7QV
//ip:172.16.4.46
//
//클라이언트 접속을 대기중입니다.
package chapter21;

import java.io.*;
import java.net.*;

public class TestClient {

	public static void main(String[] args) {
		System.out.println("클라이언트 프로그램 작동...");

		Socket socket = null; // 소켓변수 socket 선언
		try {
			socket = new Socket(args[0], 2006);
			//args에 서버의ip가 와야한다.2006번포트를 불러서 성공하면 소켓생성
			System.out.println("서버에 연결 되었습니다....");

			BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
			//클라이언트에게서 들어는데이터를잡아서 문자열로바꾼다음에 입력버퍼에넣고 그것을 reader라는객체에저장 //입력객체생성법
			String line = reader.readLine();
			//한줄씩 읽어다가 line변수생성
			System.out.println(line);
			

		} catch (IOException e) {
			System.out.println("Exception generated...");
		} finally {
			try {
				socket.close();
				System.out.println("서버와의 접속을 종료합니다.");
			} catch (Exception ignored) {
								//ignored라는 변수에 예외사항을 넣어놓고 처리는 하지않음
			}
			//아무키나 누르면 프로그램이 종료됩니다 출려문넣기
			System.out.println("종료하시려면 엔터키를 눌러주세요.");
			InputStream is = System.in;
			try {
				is.read();
			} catch (Exception e) {
				System.out.println("Client 프로그램 실행을 종료합니다.");

			}

		}

	}

}
//클라이언트 프로그램 작동...
//서버에 연결 되었습니다....
//어서오세요오오~
//서버와의 접속을 종료합니다.
//아무키나 눌러주세요.


 

클라이언트의 인자값을 입력해야한다. ip주소 또는 localhost

 


package testjava;

import java.io.InputStream;

public class ServerTest {

	public static void main(String[] args) {

		InputStream is = System.in;
		try {
			System.out.println("아무키나 누르면 서버가 종료됩니다");
			is.read();
		} catch (Exception e) {
		}
		System.out.println("서버가 종료.");

	}
}
package testjava;

import java.io.InputStream;

public class ClientTest {
	public static void main(String[] args) {

		InputStream is = System.in;

		try {
			System.out.println(args[0]);
			System.out.println("아무키나 누르면 클라이언트가 종료됩니다.");
			is.read();
		} catch (Exception e) {
		}
		System.out.println("Client 프로그램 실행을 종료합니다.");

	}

}

표시를 눌러서 콘솔작동중인것을 돌려보면서 확인할수있다

서버를 종료하지않고 여러번돌리면 충돌일어날수있음

 

재귀주소

서버앱이 클라이언트앱과 동일 컴에 설치된경우 재귀주소를 사용하면 편하다.

자신의 컴퓨터를 가리키는 주소 : 문자 localhost 

                                            IP 127.0.0.1

  공인 IP ------------------공유기 --- 사설ip a 컴퓨터

                                           --- 사설ip b 폰

                                           --- 사설ip c 프린터


서버가 여러줄의 내용을 클라이언트에게 전송할때는 반드시 newLine() 메서드로 줄구별을 해주어야한다.

package chapter22;

//전송내용이 여러줄일 때
import java.io.*;
import java.net.*;

public class TestSever2 {

	public static void main(String[] args) {
		System.out.println("왕눈이 서버 프로그램 작동됨");

		ServerSocket server = null; //서버소켓 server 선언
		try {
			server = new ServerSocket(2006); // 포트 2006감시 시작
			while (true) { //반복문 무한루프
				Socket client = server.accept(); // 클라이언트접속 대기

				InetAddress ia = client.getInetAddress();
				String name = ia.getHostName() + "\n";
				String ip = ia.getHostAddress() + "\n";

				System.out.println("클라이언트 접속됨..." + "name:" + name + "ip:" + ip);

				BufferedWriter writer = new BufferedWriter(new OutputStreamWriter
						(client.getOutputStream()));
				//클라이언트의 출력스트림을 출력문자열로바꿔주고, 그것을 출력버퍼에 넣은 writer를 생성
				// 여러줄 보내기
				writer.write("왕눈이 서버에 접속 하신것을 환영 합니다.");
				writer.newLine(); // newLine()으로 줄 구별해야한다
				writer.write("★선호하는 음식★");
				writer.newLine();
				writer.write("1. 광어, 우럭 등 각종 활어회.");
				writer.newLine();
				writer.write("2. 감자탕, 매운탕, 추어탕등 각종 탕류.");
				writer.newLine();
				writer.write("3. 왕갈비, 삼겹살, 목살, 불고기 등.");
				writer.newLine();
				writer.write("4. 순대볶음, 짬뽕라면, 참치찌개, 고등어조림.");
				writer.newLine();
				writer.write("☆즐겨 마시는 술.☆");
				writer.newLine();
				writer.write("1. 포도주, 맥주, 동동주.");
				writer.newLine();
				//한줄이 여러줄이 되었다~
				writer.flush(); // 내용전송

				try {
					client.close();
				} catch (IOException e) {
					System.out.println("Socket을 닫는 중 에러가 났습니다." + e.toString());
				}
			}
		} catch (IOException e) {
			System.out.println("Exception generated...");
		} finally {
			try {
				server.close();
				System.out.println("서버 작동을 종료합니다.");
			} catch (IOException e) {
				System.out.println("ServerSocket을 닫는중 에러가 났습니다." + e.toString());

			}
		}
		InputStream is = System.in;
		try {
			System.out.println("엔터키를 눌러주세요");
			is.read(); // 입력받으면 종료됨
		} catch (Exception e) {

		}
		System.out.println("서버 프로그램 실행을 종료 합니다.");

	}

}
//왕눈이 서버 프로그램 작동됨
//클라이언트 접속됨...name:127.0.0.1
//ip:127.0.0.1


package chapter22;

import java.io.*;
import java.net.*;

public class TestClient2 {

	public static void main(String[] args) {
		System.out.println("클라이언트 프로그램 작동...");

		Socket socket = null; //소켓 socket선언
		String line;
		int cnt = 0;

		try {
			socket = new Socket(args[0], 2006);
			System.out.println(args[0] + "번 서버에 연결 되었습니다...");

			BufferedReader reader = new BufferedReader(new InputStreamReader
					(socket.getInputStream()));
			//소켓에들어온 입력스트림을 입력문자열로바꾸주고, 그것을 입력버퍼에 넣은 reader를 생성
			while (true) { //반복문 무한루프
				line = reader.readLine(); //한줄씩 읽어다가
				if (line == null) // 줄이 비어있으면 break.
					break;
				System.out.println(line); // 한줄씩 출력한다.
			}
		} catch (IOException ioe) {
			System.out.println("Exception gernerated...");
		} finally {
			try {
				socket.close();
				System.out.println("서버와의 접속을 종료합니다.");

			} catch (Exception ignored) {
			}
		}
		InputStream is = System.in;
		try {
			System.out.println("엔터키를  눌러주세요"); 
			is.read(); //입력받으면 종료됨
			
		} catch (Exception e) {
		}
		System.out.println("서버 프로그램 실행을 종료합니다.");

	}

}
//클라이언트 프로그램 작동...
//localhost번 서버에 연결 되었습니다...
//왕눈이 서버에 접속 하신것을 환영 합니다.
//★선호하는 음식★
//1. 광어, 우럭 등 각종 활어회.
//2. 감자탕, 매운탕, 추어탕등 각종 탕류.
//3. 왕갈비, 삼겹살, 목살, 불고기 등.
//4. 순대볶음, 짬뽕라면, 참치찌개, 고등어조림.
//☆즐겨 마시는 술.☆
//1. 포도주, 맥주, 동동주.
//아무키나 눌러주세요
//서버와의 접속을 종료합니다.