210428_1~4(네트워크,사설ip/ 공인ip , 서버,클라이언트)
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. 포도주, 맥주, 동동주.
//아무키나 눌러주세요
//서버와의 접속을 종료합니다.