230308 열 여섯 번째 수업_Java

mary·2023년 3월 8일
0

국비 수업

목록 보기
16/72

URL parsing:

url을 parsing해서 경로가 디서부터 어디지인지, 호스트 이름, 프로토콜 종류, 포트번호를 얻어올 수 있다.

package network;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.InetAddress;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
import java.net.UnknownHostException;
import java.util.Arrays;

public class Network01 {

	public static void main(String[] args) {
	~여기 코드들은 15번째 수업에 있음~

/*
		 * url1(); //메인에서 호출해줘야 밑의 메소드가 출력됨
		 * url2();
		 */
		imageDown();
	}
	
	static void url1() {
		try {
			URL url = new URL("https://docs.oracle.com:5000/en/java/javase/18/docs/api/java.base/java/net/InetAddress.html?name=kim&age=25#getByName(java.lang.String)");
			System.out.println("프로토콜: " + url.getProtocol());
			System.out.println("호스트 이름: " + url.getHost());
			System.out.println("포트 번호: " + url.getPort());
			System.out.println("경로: " + url.getPath());
			System.out.println("Query: " + url.getQuery());
			System.out.println("페이지 링크: " + url.getRef());
		} catch (MalformedURLException e) {
			e.printStackTrace();
		}
	}
	// 파일 입력하기
	static void url2() {
		try {
			URL url = new URL("https://docs.oracle.com/en/java/javase/18/docs/api/java.base/java/net/InetAddress.html#getByName(java.lang.String)");
			URLConnection conn = url.openConnection();
			//1. 기반 스트림: 응답을 읽을 입력스트림, 바이트 기반
			/*InputStream is = conn.getInputStream();
			InputStreamReader isr = new InputStreamReader(is); 
			이 두 줄을 밑에서 한 줄로 표현함 */
			
			//2. 보조 스트림: BufferedReader 사용
			BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream()));
			BufferedWriter bw = new BufferedWriter(new FileWriter("InetAddress.html"));
			
			String data = null;
			while((data = br.readLine()) != null) { //한줄씩 읽어와서 data변수에 넣어라
				System.out.println(data);
				bw.write(data); //파일로 만들기
				bw.newLine(); //파일 내용을 개행 처리 해줌
			}
			
		} catch (MalformedURLException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	
	static void imageDown( ) {
		try {
			URL url = new URL("https://www.google.com/logos/doodles/2023/international-womens-day-2023-6753651837109578-l.png");
			URLConnection conn = url.openConnection();
			
			BufferedInputStream bis = new BufferedInputStream(conn.getInputStream());
			BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("image.png"));
			
			//한 행 읽어와서 한 행 쓰게 하기
			byte[] data = new byte[8*1024]; //8k Byte
			int len = 0;
			while((len = bis.read(data)) != -1) { //bis에서 읽어온 걸 data 배열에 넣어서 그 배열을 len에
				System.out.println(Arrays.toString(data));
				bos.write(data,0,len);
				
			}
		} catch (MalformedURLException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}

TCP를 이용한 통신

* 콘솔창에 돌아가는게 없어야 돼서 xx 아이콘 눌러 깔끔하게 만듦.
* 콘솔 더보기해서 새 콘솔 생성하면 서버와 클라이언트 나눠서 볼 수 있음
* 콘솔 고정 아이콘 누르면 그 콘솔은 해당 프로그래밍만 실행됨

package messenger04;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;

public class ServerProgram {

	public static void main(String[] args) {
		int port = 3001;
		Scanner sc = new Scanner(System.in);
		try {
			try(ServerSocket server = new ServerSocket(port)) {
				System.out.println("클라이언트의 요청을 기다리고 있음");
				Socket socket = server.accept();
				System.out.println(socket.getInetAddress().getHostAddress() + "가 연결요청함");
				
				try(BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
					PrintWriter pw = new PrintWriter(socket.getOutputStream())) {

					pw.println("환영합니다😊😊");
					pw.flush();
					
					//클라이언트에서 끝내기
					String msg = null;
					while((msg = br.readLine()) != null) {
						if(msg.equals("끝")) {
							System.out.println("통신을 종료합니다.");
							break;
						}
						
						System.out.println("클라이언트가 보낸 메세지: " + msg);
						System.out.println("서버: ");
						//서버 측에서 끝내기
						String sendMsg = sc.nextLine();
						pw.println(sendMsg);
						pw.flush();
						
						if(sendMsg.equals("끝"))
							break;
					}
					System.out.println(socket.getInetAddress().getHostAddress() + "와 연결을 해제");
				}
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}



package messenger04;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Scanner;

public class ClientProgram {

	public static void main(String[] args) {
		int port = 3001; 
		try {
			String ip = InetAddress.getLocalHost().getHostAddress();
			System.out.println(ip);
			Scanner sc = new Scanner(System.in);

			try(Socket socket = new Socket(ip, port)) {
			System.out.println("서버와 연결 성공");
			
				try(BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
				PrintWriter pw = new PrintWriter(socket.getOutputStream())) {
					/*
					System.out.println("서버에서 보낸 환영메세지: " + br.readLine());
				
					while(true) {
						System.out.println("클라이언트가 보낸 메세지: ");
						String sendMsg = sc.nextLine(); //보낸 메세지를 저장해놔야 끝을 낼 수 있음
						pw.println(sendMsg);
						pw.flush();
						
						if(sendMsg.equals("끝")) //String이라서 ==안되고 equals
							break;
						System.out.println("서버: " + br.readLine());
					}
					*/
				
					String msg = null;
					while((msg = br.readLine()) != null) {
						System.out.println("서버: " + msg);
						//서버측에서 끝내기
						if(msg.equals("끝")) {
							System.out.println("통신을 종료합니다.");
							break;
						}
						//클라이언트에서 끝내기
						System.out.println("클라이언트가 보낸 메세지: ");
						String sendMsg = sc.nextLine();
						pw.println(sendMsg);
						pw.flush();
						
						if(sendMsg.equals("끝")) 
							break;
					}
					System.out.println("서버와 연결을 해지함");
				}
			}
		} catch (UnknownHostException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}


컬렉션 프레임워크:

-컬렉션은 자바에서 제공하는 자료구조를 담당하는 프레임워크
-추가,삭제,정렬등의 메서드가 다 구현되어있어 자료구조적 알고리즘을 구현할 필요 없음

ArrayList는 동기화를 제공하지 않고 Vector는 동기화를 제공함
그래서 Vetor는 성능이 좋지 않아 하나의 메인을 쓸 때는 거의 성능이 제일 좋은 ArrayList를 사용함.
이거 빼곤 메소드고 사용법이고 둘은 다 똑같음


Vector와 ArrayList

package collection.vector01;

import java.util.ArrayList;
import java.util.List;
import java.util.Vector;

public class Vector1 {

	public static void main(String[] args) {
		Vector vector = new Vector(); //꺽새 안 쓰면 모든 객체 자료형 받음
		ArrayList al = new ArrayList();
		
		List<Student> vlist = new Vector<>(); //부모자료형으로 형변환
		List<Student> alist = new ArrayList<>();
		//Vector와 ArrayList는 객체 자료형이기 때문에 <>표시로 해당 객체의 타입만 들어올 수 있도록 함
		
		
		vlist.add(new Student("홍길동", 480));
		vlist.add(new Student("kh정보", 30));
		vlist.add(new Student("아무개", 25));
		vlist.add(new Student("김말똥", 29));
		vlist.add(new Student("이말순", 21));
		
		alist.add(new Student("홍길동", 480));
		alist.add(new Student("kh정보", 30));
		alist.add(new Student("아무개", 25));
		alist.add(new Student("김말똥", 29));
		alist.add(new Student("이말순", 21));
		
		vlist.remove(1); //이렇게 인덱스 하나 삭제하면 인덱스 번호가 자동으로 앞으로 당겨짐
		
		for(int i=0; i<vlist.size(); i++) {
			Student student = vlist.get(i); // index에 있는 객체 얻어오기
			System.out.println(student.getName()+ "\t" + student.getStuNo());
		}
		alist.clear(); //모두 다 삭제
		if(!alist.isEmpty()) {
			for(int i=0; i<alist.size(); i++) {
				Student student = alist.get(i);
				System.out.println(student.getName()+ "\t" + student.getStuNo());
			}
		}else
			System.out.println("데이터가 없습니다.");
	}

}


package collection.vector01;

import java.util.Vector;

public class Vector2 {

	public static void main(String[] args) {
		Vector v = new Vector(); //매개변수로 어떠한 객체든 다 받겠다. 권장x, 
		//Vector는 쓰레드가 여러개라 동기화가 필요할 때 씀
		//ArrayList v = new ArrayList();로도 똑같이 가능, 더 권장!
		
		v.add(1);
		v.add(3.98);
		v.add("487");
		v.add(new Integer(8));
		v.add(new Double(6.89)); //버전 9부터 사라진다네요
		v.add(new String("kh"));
		
		Object obj = v.get(0);
		int i = (int)v.get(0); //정수로 넣어도 무조건 객체형임 그래서 Object로 변환가능
		System.out.println(i);
		
		double d = (double)v.get(1);
		System.out.println(d);
		
		int i3 = Integer.parseInt((String)v.get(2)); //String을 가져올땐 Integer로 변환
		System.out.println(i3*8);
	}

}
profile
내 인생을 망치러 온 나의 구원, 개발

0개의 댓글