반응형

 

FileEx04.java
PrintWriter

package fileex;

import java.io.PrintWriter;

public class FileEx04 {
	public static void main(String[] args) {
		PrintWriter pw = new PrintWriter(System.out);
		//표준 출력(모니터 출력)을 의미하는
		//System.out(PrintWriter 객체)을 이용하여 객체 pw를 생성
		
		pw.print("알기쉽게 해설한 자바! ");
		pw.println('A');
		pw.println(500 + 500);
		pw.println(40000L);
		pw.println(12.34f);
		pw.printf("%f \n", 12.34);
		pw.println(new Integer("1999"));
		pw.close();	
	}
}
알기쉽게 해설한 자바! A
1000
40000
12.34
12.340000 
1999

 

FileEx05.java
getPath
getAbsolutePath
getParent
separator
separatorChar
package fileex;

import java.io.*;

public class FileEx05 {

	public static void main(String[] args) throws IOException {
		File f = new File("C:/jwork/First/fileEx/FileEx01.java");
		
		String fileName = f.getName();//확장자 포함
		int pos = fileName.lastIndexOf("."); //8
		
		System.out.println("경로를 제외한 파일이름 - " + fileName);
		System.out.println("확장자를 제외한 파일이름 - " + fileName.substring(0, pos));//원본훼손x 일시적
		System.out.println("확장자 - " + fileName.substring(pos + 1));
		
		System.out.println("경로를 포함한 파일이름 - "  + f.getPath()); //웹에서는 도메인주소가 될 수도
		System.out.println("파일의 절대경로       - " + f.getAbsolutePath());
		System.out.println("파일이 속해 있는 디렉토리 - " + f.getParent());
		System.out.println();
		System.out.println("File.separator - " + File.separator); //구분자 - 문자열
		System.out.println("File.separatorChar - " + File.separatorChar); //Char 반환되는 자료열이 다름
		System.out.println("현재 파일이 작업중인 디렉토리(프로젝트) = " + System.getProperty("user.dir"));
	}
}​
경로를 제외한 파일이름 - FileEx01.java
확장자를 제외한 파일이름 - FileEx01
확장자 - java
경로를 포함한 파일이름 - C:\jwork\First\fileEx\FileEx01.java
파일의 절대경로       - C:\jwork\First\fileEx\FileEx01.java
파일이 속해 있는 디렉토리 - C:\jwork\First\fileEx

File.separator - \
File.separatorChar - \
현재 파일이 작업중인 디렉토리(프로젝트) = C:\jwork\lastprj
FileEx06.java
Microsoft Windows [Version 10.0.19045.3803]
(c) Microsoft Corporation. All rights reserved.

C:\Users\Hi>cd c:\jwork\lastprj

c:\jwork\lastprj>dir
 C 드라이브의 볼륨에는 이름이 없습니다.
 볼륨 일련 번호: 209B-2276

 c:\jwork\lastprj 디렉터리

2024-01-08  오후 04:50    <DIR>          .               //<DIR>디렉터리명
2024-01-08  오후 04:50    <DIR>          ..
2024-01-08  오후 02:50               396 .classpath
2024-01-08  오후 02:50               383 .project
2024-01-08  오후 02:50    <DIR>          .settings
2024-01-08  오후 02:51    <DIR>          bin
2024-01-08  오후 05:37                11 data1.txt
2024-01-08  오후 02:51    <DIR>          src
2024-01-08  오후 05:37                 5 stream1.txt
2024-01-08  오후 04:37                49 test.txt
               5개 파일                 844 바이트
               5개 디렉터리  169,301,598,208 바이트 남음

c:\jwork\lastprj>​
package fileex;

import java.io.File;
import java.sql.Date;
import java.text.SimpleDateFormat;

public class FileEx06 {

	public static void main(String[] args) {
		String currDir = System.getProperty("user.dir");// c:\\jwork\\lastprj
		File dir = new File(currDir);
		File[] files = dir.listFiles();
		
		for (int i = 0 ; i < files.length; i++) {
			File f = files[i];
			String name = f.getName();
			SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm a");
			String attibute = "";
			String size = "";
			
			if (files[i].isDirectory()) {
				attibute = "DIR";
			} else {
				size = f.length() + " "; //size 파일크기
				attibute = f.canRead() ? "R" : " "; //canRead 읽기전용파일
				attibute += f.canWrite() ? "W" : " "; //canWrite 쓰기전용파일
				attibute += f.isHidden() ? "H" : " "; //isHidden 숨김파일
			}
			System.out.printf("최종 수정일: %s , 파일속성: %3s , 용량: %6s, 파일명: %s\n", 
					df.format(new Date(f.lastModified())), attibute, size, name);
		}
	}
}
최종 수정일: 2024-01-08 14:50 오후 , 파일속성: RW  , 용량:   396 , 파일명: .classpath
최종 수정일: 2024-01-08 14:50 오후 , 파일속성: RW  , 용량:   383 , 파일명: .project
최종 수정일: 2024-01-08 14:50 오후 , 파일속성: DIR , 용량:       , 파일명: .settings
최종 수정일: 2024-01-08 14:51 오후 , 파일속성: DIR , 용량:       , 파일명: bin
최종 수정일: 2024-01-08 17:37 오후 , 파일속성: RW  , 용량:    11 , 파일명: data1.txt
최종 수정일: 2024-01-08 14:51 오후 , 파일속성: DIR , 용량:       , 파일명: src
최종 수정일: 2024-01-08 17:37 오후 , 파일속성: RW  , 용량:     5 , 파일명: stream1.txt
최종 수정일: 2024-01-08 16:37 오후 , 파일속성: RWH , 용량:    49 , 파일명: test.txt​
FileEx07.java
package fileex;

import java.io.File;

public class FileEx07 {

	public static void main(String[] args) {
		try {
			File f = new File("c:/jwork/lastprj/src/fileex", "FileEx01_00.java");
//			File f = new File("c:/jwork/lastprj/src/fileex/FileEx01_00.java"); "," 또는 /로 구분
			
			System.out.println(f.getName());
			System.out.println(f.exists()); //존재여부
			System.out.println(f.getPath());
			System.out.println(f.length()); //파일용량
			System.out.println(File.separator);
//			boolean result = new File("c:/jwork/Exam/log").mkdir();
//			boolean result = new File("c:/jwork/Exam").mkdir();
			boolean result = new File("c:/jwork/Exam/log").mkdirs(); //mkdirs 폴더생성
			
			if (result==true) {
				System.out.println("Exam 디렉토리 생성 성공");
			} else {
				System.out.println("Exam 디렉토리 생성 실패");
			}
			
			String[] listing = new File("c:/jwork/Exam").list();
			for(String x : listing) {
				System.out.println("디렉토리 목록 : " + x);
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}​
FileEx01_00.java
true
c:\jwork\lastprj\src\fileex\FileEx01_00.java
1392
\
Exam 디렉토리 생성 성공
디렉토리 목록 : log​

프로세스(Process)

: 실행하고 있는 프로그램 또는 실행한 프로그램이 메모리에 올라와있는 상태
  장점  단점 
단일 프로세스
: 하나의 프로그램 당 하나의 프로세스만을 가지고 있는 것
- 메모리를 많이 차지하지 않음.
- 속도가 빠름
- 하나의 프로세스에 문제가 발생되면 프로그램이 종료가 됨
멀티 프로세스
: 하나의 프로그램 당 여러개의 프로세스를 가지고 있는 것
ex) 크롬브라우저
- 하나의 프로세스에 문제가 발생되도 프로그램이 전체적으로 영향을 받지 않는다.
- 독립적으로 작업이 진행된다.
- 메모리를 단일프로세스보다 많이 차지함.
- 속도가 느릴 수 있다.

스레드(Thread)

: 프로세스 안에서 실행되는 하나의 작업 단위
자바에서는 기본적으로 한 개의 스레드를 가지고 있다.
작업순서가 없다.
ex) main메소드
단일 스레드
: 프로세스 안에 하나의 스레드만 존재함
- 메모리를 많이 차지하지 않는다. - 멀티 작업을 하는 경우에는 멀티스레드보다 속도가 느릴 수 있다.
멀티 스레드
: 프로세스 안에 여러 개의 스레드가 존재
- 멀티작업을 하는 경우에는 단일 스레드보다 속도처리가 빠를 수 있다.
- 독립적인 작업이 가능하다.
- 단일 스레드보다는 메모리를 많이 차지한다.
BeepPrintExample1.java
Thread
package thread01;

public class BeepPrintExample1 {
	public static void main(String[] args) {
		for(int i = 0 ; i < 5 ; i++) {
			System.out.println("띵");
			try { Thread.sleep(500); } catch(Exception e) {}
		} // 해당 Thread가 InterruptedException을 요청함. 1/1000초 sleep
		for(int i = 0 ; i < 5 ; i++) {
			System.out.println("동");
			try { Thread.sleep(500); } catch(Exception e) {}
		}
	}
}​
띵
띵
띵
띵
띵
동
동
동
동
동​
BeepPrintExample2.java
package thread01;

public class BeepPrintExample2 {
	public static void main(String[] args) {
//		//Runnable가 인터페이스라 [객체를 직접 생성]하여 스레드생성자의 매개인자로 보내어 스레드 객체 생성
//		Runnable beepTask = new BeepTask();
//		Thread thread = new Thread(beepTask);
		
//		Runnable 객체를 [익명클래스]로 생성하여 스레드생성자의 매개인자로 보내어 스레드 객체 생성
		Thread thread = new Thread(new Runnable() {
			@Override
			public void run() {
				for(int i = 0; i < 5; i++) {
					System.out.println("동");
					try { Thread.sleep(500); } catch(Exception e) {}
				}
			}
		});
		
//		Runnable 객체를 [람다식]으로 생성하여 스레드생성자의 매개인자로 보내어 스레드 객체 생성
//		Thread thread = new Thread(() -> {
//			for(int i=0; i<5; i++) {
//				System.out.println("동");
//				try { Thread.sleep(500); } catch(Exception e) {}
//			}
//		});
		
		thread.start(); //해당 메소드 실행
		
		for(int i = 0; i < 5; i++) {
			System.out.println("띵");
			try { Thread.sleep(500); } catch(Exception e) {}
		}
	}
}​​

BeepTask.java

package thread01;

public class BeepTask implements Runnable {

	@Override
	public void run() { //main메소드처럼 실행되지만 
		
		for(int i = 0; i < 5; i++) {
			System.out.println("동");
			try { Thread.sleep(500); } catch(Exception e) {}
		}
	}
}​
띵
동
띵
동
띵
동
동
띵
동
띵

 

BeepPrintExample3.java

package thread01;

public class BeepPrintExample3 {
	public static void main(String[] args) {
		//Thread를 상속받은 하위클래스로 객체를 생성하면
		//Runnable객체를 구현하지 않아도 스레드 작업이 가능하다.
		Thread thread = new BeepThread();
		
		thread.start();
		
		for(int i = 0; i < 5; i++) {
			System.out.println("띵");
			try { Thread.sleep(500); } catch(Exception e) {}
			//주체는 main method
		}
	}
}
package thread01;

public class BeepThread extends Thread {
	@Override
	public void run() {
		for(int i = 0; i < 5; i++) {
			System.out.println("동");
			try { Thread.sleep(500); } catch(Exception e) {}
		}
	}
}
띵
동
띵
동
동
띵
띵
동
띵
동

ThreadNameExample.java

package thread02;

public class ThreadNameExample {
	public static void main(String[] args) {
		Thread mainThread = Thread.currentThread();
		//Thread.currentThread(); 기본적으로 main 으로 부여받음
		System.out.println("프로그램 시작 스레드 이름: " + mainThread.getName());
	
		ThreadA threadA = new ThreadA(); //Thread-0 ThreadA
		//Thread생성시 main을 제외하고는 인덱스번호로 Name이 부여됨
		System.out.println("작업 스레드 이름: " + threadA.getName());
		threadA.start();
		
		ThreadB threadB = new ThreadB(); //Thread-1 ThreadB
		System.out.println("작업 스레드 이름: " + threadB.getName());
		threadB.start();
	}
}
package thread02;

public class ThreadA extends Thread{
	public ThreadA () {
		setName("ThreadA"); //ThreadA class 이름을 ThreadA으로 지음
	}
	
	public void run() {
		for(int i=0; i<2; i++) {
			System.out.println(getName() + "가 출력한 내용");
		}
	}
}
package thread02;

public class ThreadB extends Thread{
	public void run() {
		for(int i=0; i<2; i++) {
			System.out.println(getName() + "가 출력한 내용");
		}
	}
}
프로그램 시작 스레드 이름: main
작업 스레드 이름: ThreadA
ThreadA가 출력한 내용
ThreadA가 출력한 내용
작업 스레드 이름: Thread-1
Thread-1가 출력한 내용
Thread-1가 출력한 내용

 

MainThreadExample.java
package thread03_001_unsynchronized;

public class MainThreadExample {
	public static void main(String[] args) {
		Calculator calculator = new Calculator(); //&100
		
		User2 user2 = new User2(); //Thread-0 //User2
		user2.setCalculator(calculator); 
		user2.start();
		
		User1 user1 = new User1(); //Thread-1 //User1
		user1.setCalculator(calculator); //&100
		user1.start();
	}
}​
package thread03_001_unsynchronized;

public class Calculator {
	private int memory; //50 //100

	//public Calculator (){}
	public int getMemory() {
		return memory;
	}

	public void setMemory(int memory) {
		this.memory = memory;
		//System.out.println(4/0);
		//스레드는 자원공유하기에 에러발생시 모든 스레드에서 에러발생함
		try {
			Thread.sleep(2000);
		} catch(InterruptedException e) {}
			System.out.println(Thread.currentThread().getName() + ": " + this.memory);
		}
}​
package thread03_001_unsynchronized;

public class User1 extends Thread {
	private Calculator calculator;
	
	public void setCalculator(Calculator calculator) {
		this.setName("User1");
		this.calculator = calculator;
	}
	@Override
	public void run() {
		calculator.setMemory(100);
	}
}​
package thread03_001_unsynchronized;

public class User2 extends Thread  {
	private Calculator calculator; //null //&100
	
	public void setCalculator(Calculator calculator) { //&100
		this.setName("User2");
		this.calculator = calculator;
	}
	@Override
	public void run() {
		calculator.setMemory(50);
	}
}​
User2: 100
User1: 100​

synchronized

package thread03_002_synchronized;

public class MainThreadExample {
	public static void main(String[] args) {
		Calculator calculator = new Calculator(); //&100
		
		User2 user2 = new User2(); //Thread-0 //User2
		user2.setCalculator(calculator); 
		user2.start();
		
		User1 user1 = new User1(); //Thread-1 //User1
		user1.setCalculator(calculator); //&100
		user1.start();
		//synchronized에서 동시다발적으로 실행되지 않고 먼저 진행되는 thread.sleep 후 실행됨
	}
}
package thread03_002_synchronized;

public class Calculator {
	private int memory; 

	public int getMemory() {
		return memory;
	}

	public synchronized void setMemory(int memory) {
		//synchronized 작업하고 있는 와중에 다른 쓰레드의 접근을 막음
		this.memory = memory;
		try {
			Thread.sleep(2000);
		} catch(InterruptedException e) {}
			System.out.println(Thread.currentThread().getName() + ": " + this.memory);
		}
}
User2: 50
User1: 100
JoinEx.java
Join
package thread04;

class MyThread extends Thread{
	public void run() {
	for(int i = 0; i <5; i++) {
			System.out.println("MyThread5 : " + i);
			try {
				Thread.sleep(500);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
	}
}


public class JoinEx {
	public static void main(String[] args) {
		MyThread thread = new MyThread(); //Thread-0
		// Thread 시작을 위해 객체생성 먼저 진행
		thread.start(); //run()메소드 호출 및 실행
		System.out.println("Thread가 종료될때까지 기다립니다.");
		try {
			thread.join(); 
			//thread 해당 쓰레드가 멈출때까지 여기에서 멈춤
			/*thread.join(); 명령을 내린 main쓰레드를
			 *thread(MyThread) 쓰레드의 작업이 모두 종료될 때까지
			 *마너지 일을 처리하지 않고 대기하고 기다리게 하세요.
			*/
		} catch (InterruptedException e) {
			e.printStackTrace();
		} //try~catch문 삭제시 동시다발실행됨
		System.out.println("Thread가 종료되었습니다.");
	}
}
Thread가 종료될때까지 기다립니다.
MyThread5 : 0
MyThread5 : 1
MyThread5 : 2
MyThread5 : 3
MyThread5 : 4
Thread가 종료되었습니다.​
ThreadWait.java
ticketing
package thread04;

//**notify()와 wait()메소드는 반드시 synchronized블록 안에서만 사용할 수 있다.

class ThreadBB extends Thread {
	//해당 thread가 실행되면 자기 자신의 모니터링 락을 획득
	//5번 반복하면서 1초씩 쉬면서 total에 값을 누적
	//그 후에 notify()메소드를 호출하여 wait하고 있는 thread를 깨움
	int total;

	@Override
	public void run() {
		synchronized (this) {
			for (int i =0; i <5; i++) {
				System.out.println("ThreadBB : "+ i);
				total += i;
				try {
					Thread.sleep(1000);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
			notify();//멈춰놓은 thread가 있는 경우 랜덤으로 1개는 깨움
			//해당 클래스에서는 생략해도 상관없음
//			notifyall();//멈춰놓은 thread가 있는 경우 랜덤으로 1개씩 모두 깨움
		}
		System.out.println("ThreadBB의 작업 종료");
	}
}
public class ThreadWait {
	public static void main(String[] args) {
		// 해당 thread가 실행되면, 해당 thread는 run메서드 안에서 자신의 모니터링 락을 획득
		ThreadBB b = new ThreadBB();
		b.start();
		
		// b에 대하여 동기화 블럭을 설정
		// 만약 메인thread가 아래의 블록을 위의 ThreadBB보다 먼저 실행되었다면
		// wait를 하게 되면서 모니터링 락을 놓고 대기
		synchronized (b) {
			try {
				//b.wait() 메서드를 호출
				//메인 thread는 정지
				//ThreadBB가 5번 값을 더한 후 notify를 호출하게 되면 wait에서 깨어남
				System.out.println("b 종료까지 대기");
				b.wait(); //해당 동기화 1개에 대해서만 wait 거는게 좋음
				//join강제대기, wait대기
				System.out.println("b쓰레드 동기화 종료 후 실행");
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			
			//깨어난 후 결과를 출력
			System.out.println("total : " + b.total);
		}
		System.out.println("메인쓰레드 종료");
	}
}​
b 종료까지 대기
ThreadBB : 0
ThreadBB : 1
ThreadBB : 2
ThreadBB : 3
ThreadBB : 4
ThreadBB의 작업 종료
b쓰레드 동기화 종료 후 실행
total : 10
메인쓰레드 종료​

네트워크 (Network)

인터넷  : 지역네트워크를 통신으로 연결할 것
네트워크  : 여러 대의 컴퓨터들을 통신회선으로 연결한 것. 그물망처럼 연결된 통신망
네트워크 종류
- PAN(Personal Area Network) : 가장 작은 규모의 네트워크 ex) bluetooth
- LAN(Local Area Network) : 근거리 영역 네트워크 ex) Wi-Fi
- MAN(Metropolitan Area Network) : 대도시 영역 네트워크. ex) 대학교내 통신망
- WAN(Wide Area Network) : 광대역 네트워크 ex) 핸드폰5G망
- VAN(Value Area Network)
: 공중 통신 사업자로부터 통신 회선을 임대하여 하나의 사설망을 구축하고 이를 통해 정보의 축적, 가공, 변환 처리등 부가가치를 첨가한 후 불특정 다수를 대상으로 서비스를 제공하는 통신망
ex) 은행 간 현금인출기 공동 이용 서비스, 신용카드 정보 시스템, 국내외 항공사간 항공권 예약 서비스
- ISDN(Integrated Services Digital Networks) : 종합정보 통신망(=BISDN) 전화, 팩스, 데이터 통신, 비디오텍스 등 통신관련 서비스를 종합하여 다루는 통합서비스 디지털 통신망. 디지털 전송방식과 광섬유 케이블 사용
프로토콜(protocol) : 통신을 주고 받기 위한 통신 규칙. 컴퓨터와 컴퓨터도 서로 이해 할 수 있는 언어, 공용된 언어를 사용해야 한다는 것
- IP(Internet protocol address) : 네트워크상에서 장치들이 서로 통신을 하기 위한 규칙에 필요한 서로를 식별하기 위한 고유 주소 또는 특수번호를 말함.(집주소처럼 컴퓨터 주소라고 보면 됨. 하나의 랜카드 당 한 개의 ip가 할당되어 있다.)
**랜카드 : 네트워크를 사용하기 위한 어댑터 역할을 하는 장치
  - IP는 흐름에 관여하지 않기 때문에 보낸 정보가 제대로 갔는지 보장하지 않는다. 전송과정에서 패킷이 손상될 수도 있고, 같은 호스트에서 전송한 패킷의 순서가 뒤죽박죽이 될 수도 있고, 같은 패킷이 두 번 전송될 수도 있으며, 아예 패킷이 사라질 수도 있기 때문에 패킷 전송과 정확한 순서를 보장하려면 TCP 프로토콜과 같은 IP 상위 프로토콜을 이용해야 한다.
- TCP((Transmission Control Protoco)전송 제어 프로토콜(Tl, 문화어 : 전송조종(제어)규약(규칙))
: 웹 브라우저들이 월드와이드 웹(www 대부분 웹이라 칭함)에서 서버에 연결할 때 사용되며, 이메일 전송이나 파일 전송에도 사용된다.
- 포트(port)  : 같은 ip에서 접근해야하는 프로그램이 여러 개일 경우 해당 프로그램에 대해 접근하기 위해 부여된 프로그램주소값
서버  : 서비스를 제공하는 프로그램
클라이언트 : 서비스를 요청하고, 받는 프로그램

호스팅서버 : 대용량 서버로 웹서버, 데이터베이스 등을 저장할 수 있는 공간, 근래 가상으로도 제공

 

InetAddress 클래스

 
IP주소를 표현한 클래스
ip주소뿐만 아니라 도메인을 이용하여 ip정보를 가져올 수도 있다.
자바에서는 모든 ip주소를 InetAddress 클래스를 사용한다.
default로 된 생성자가 하나 존재하나 객체 생성 불가
호스트 이름과 호스트에 대응하는 ip주소를 알 수 있는 메서드를 제공한다.
객체를 반환하는 메소드(키워드가 모두 static임)  
getAllByName(String host) : 매개변수 host에 대응되는 InetAddress 클래스 배열을 반환
getAddress(byte[] addr) : 매개변수 addr에 대응되는 InetAddress 클래스 객체를 반환
getByAddress(String host, byte[] addr) : 매개변수 host, addr로 생성한 InetAddress 클래스객체를 반환
getByName(String host) : 매개변수 host에 대응되는 InetAddress 클래스객체를 반환
getLocalHost() : 로컬호스트의 InetAddress 클래스 객체를 반환
Localhost는 서버의 기능을 제공하는 자신의 컴퓨터를 의미
IPv4에서 IP주소는 127.0.0.1이다 (32비트 표현)
IPv6은 32비트의 ipv4의 값의 표현이 제한적이라 보완되어 나온 물리적 주소 표기방법임. (128비트)
메소드  
getAddress() : InetAddress 클래스객체의 실제 ip주소를 바이트 배열로 반환
getHostAddress() : ip주소를 문자열로 반환
getHostName() : 호스트 이름을 문자열로 반환
toString() :ip주소를 String으로 오버라이딩한 메소드
"호스트이름/ip주소"형식으로 값을 반환함
NetEx01.java
package networkex;

import java.net.*;

public class NetEx01 {
	public static void main(String[] args) throws UnknownHostException {
		InetAddress Address = InetAddress.getLocalHost();
		//getLocalHost() 메소드는 static으로 선언된 클래스 메소드임
		System.out.println("로컬 컴퓨터의 이름 : " + Address.getHostName());
		//호스트 이름을 문자열로 반환
		System.out.println("로컬 컴퓨터의 IP주소1 : " + Address.getHostAddress());
		//IPv4주소
		System.out.println("로컬 컴퓨터의 IP주소2 : " + Address.toString());
		//ip주소를 String으로 오버라이딩한 메소드. "호스트이름/ip주소"형식으로 값을 반환함
		System.out.println("로컬 컴퓨터의 IP주소3 : " + Address);
		//윗 값과 동일
		System.out.println();
		
		Address = InetAddress.getByName("java.sun.com");
		//매개변수 host에 대응되는 InetAddress 클래스객체를 반환
		System.out.println("java.sun.com 컴퓨터의 이름과 IP주소 : " + Address);
		//서버가 여러개일 경우 IP주소가 계속 바뀜
		System.out.println();
		
		System.out.println("naver도메인에 대응되는 IP를 반환함");
		//http://223.130.200.104 또는 http://223.130.195.95 로 접근 가능
		InetAddress sw[] = InetAddress.getAllByName("www.naver.com");
		//배열로반환하는 이유는 해당 도메인에 있는 모든 IP값을 받기 위해서임
		for (int i = 0; i<sw.length; i++)
			System.out.println(sw[i]);
		
		for(InetAddress i : sw) {
			System.out.println(i);
		}
	}
}​
로컬 컴퓨터의 이름 : DESKTOP-21JQDMI
로컬 컴퓨터의 IP주소1 : 192.168.0.53
로컬 컴퓨터의 IP주소2 : DESKTOP-21JQDMI/192.168.0.53
로컬 컴퓨터의 IP주소3 : DESKTOP-21JQDMI/192.168.0.53

java.sun.com 컴퓨터의 이름과 IP주소 : java.sun.com/23.211.117.169

naver도메인에 대응되는 IP를 반환함
www.naver.com/223.130.195.95
www.naver.com/223.130.200.104
www.naver.com/223.130.195.95
www.naver.com/223.130.200.104​
NetEx02.java
package networkex;

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

public class NetEx02 {
	public static void main(String[] args) {
		URL url = null;
		BufferedReader input = null;
		//Buffered 일시적으로 필요한 저장공간을 늘린다.
		String address = "https://www.naver.com/index.html";
		String line = "";
		
		try {
			url = new URL(address);
			input = new BufferedReader(new InputStreamReader(url.openStream()));
			
			while ((line = input.readLine()) != null) {
				//readLine()한줄단위로 호출. 호출할값이 없을 경우 null. 무한반복
				System.out.println(line);
			}
			input.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
		
		try {
//			url = new URL("http://naver.me/5y0TpClb");
//			url = new URL("http://www.example.com:80/search/index.html?d=Java");
			url = new URL("http://localhost:8080/");
			String protocal = url.getProtocol();
			System.out.println("프로토콜: " + protocal);
			
			String host = url.getHost();
			System.out.println("호스트명: " + host);
			
			int port = url.getPort();
			System.out.println("포트번호: " + port);
			
			String file = url.getFile();
			System.out.println("파일 이름( 경로+쿼리 문자열 ): " + file);
			
			String path = url.getPath();
			System.out.println("경로: " + path);
			
			String query = url.getQuery();
			System.out.println("쿼리 문자열: " + query);
		} catch (MalformedURLException e) {
			e.printStackTrace();
		}
	}
}​

네이버 블라블라~
프로토콜: http
호스트명: localhost
포트번호: 8080
파일 이름( 경로+쿼리 문자열 ): /
경로: /
쿼리 문자열: null​

 

소캣(Socket)
: 프로그램이 네트워크에서 데이터를 통신할 수 있도록 연결해주는 연결부
 
ServerSocket 클래스(서버측)
- java.net패키지에서 제공
- 서버 프로그램을 개발할 때 쓰이는 클래스
- 서버를 구동 시킬때, 요청을 받기위한 준비를 할 때 사용
- 서버를 구동시키는 것이므로 ip주소는 필요없으며, 자신의 서버에 제대로 접근할 수 있는 포트번호만 있으면 된다.
ex)ServerSocket echoServer = new ServerSocket (4000); //4000이 포트번호임.
 
Socket클래스(클라이언트측/서버측)
- java.net패키지에서 제공
- clinet에서 서버로 접속하거나 Server에서 요청을 accept하는데 필요한 클래스
- 서버에 접근을 해야하므로 해당 서버의 ip주소와 해당 서버내의 프로그램이 부여받은 포트번호까지 필요하다.
ex) Socket socket = new Socket("127.0.0.1", 4000);
//서버의 ip주소 : "127.0.0.1", 서버의 포트번호 : 4000
클라이언트의 요청을 수락해야하므로 Socket으로 요청한 자료형과 일치되는 Socket자료형으로 accept해주어야 함.
ex) Socket socket = echoServer.accept();
 
TCP/IP송수신 과정
1.서버 : 클라이어트의 요청을 받기 위한 준비를 한다.(ServerSocket)
ServerSocket echoServer= new ServerSocket (4000);
2. 클라이언트 : 서버에 접속 요청을 한다. (Socket)
Socket socket = new Socket ("127.0.0.1", 4000);
2. 서버 : 클라이언트의 요청을 받아 들인다. (accept)
Socket socket = echoServer.accept();
3. 클라이언트 : 서버에 메시지를 보낸다. ( BufferedWriter )
3. 서버 : 클라이언트가 보낸 데이터를 출력한다. ( BufferedReader )​
4. 서버 : 클라이언트에 메시지를 보낸다. ( BufferedWriter​ )
4. 클라이언트 : 서버가 보낸 메시지를 출력한다.( BufferedReader )​
5. 서버, 클라이언트 모두 종료 : 종료한다.( socket.close() )
 
반응형

+ Recent posts