728x90
반응형
FileEx04.java
PrintWriterpackage 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() )
|
728x90
반응형
'[JAVA]' 카테고리의 다른 글
[JSP] 04_01_expression.jsp - Date/ 05_02_welcome.jsp - bootstrap/ 06_03_page_errorPage.jsp - error (0) | 2024.03.12 |
---|---|
[21일차] (0) | 2024.01.10 |
[19일차] Exception try ~ catch throws stack (0) | 2024.01.08 |
[18일차] HashMap Hashtable Anonymous InnerClass InstanceInner StaticInner Local Ramda (0) | 2024.01.05 |
[17일차] Generic Wildcard Collection Framework (0) | 2024.01.04 |