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();
}
}
}
* 콘솔창에 돌아가는게 없어야 돼서 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를 사용함.
이거 빼곤 메소드고 사용법이고 둘은 다 똑같음
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);
}
}