#34

조성현·2023년 4월 14일
0

웹서버

-> html과 그 외의 기타 자료 정보 - 공개, 공식제공 자료는 아니다.
hyml(image) 크롤링, 스크래핑
=> 가공해서 사용
: String, StringBuffer, StringBuilder
: Regular Expression(POSIX)
: Library(API) - JSoup

-> Open API - 공식제공 : 회원가입(api key)
: text - CSV / XML / JSON {} 객체, [] 배열
String, StringBuffer, StringBuilder - 문자열
Library(API) - 상수
: Library(API)

https://jsonlint.com/
json.org

open API를 이용(xml)

URLConnection을 사용

public static void main(String[] args) {
		// Parsing = 문서 분석
		BufferedReader br = null;
		try {
        	//영화 주간 박스 사이트 정보 가져옴
			URLConnection conn = new URL("http://kobis.or.kr/kobisopenapi/webservice/rest/boxoffice/searchWeeklyBoxOfficeList.xml?key=f5eef3421c602c6cb7ea224104795888&targetDt=20230408").openConnection();
			br = new BufferedReader(new InputStreamReader(conn.getInputStream()));

			//이 사이트의 데이터는 한 줄 => while 할 필요 없다
			String line = br.readLine();

			boolean flag = false;
			
			//데이터의 공통된 부분 찾아서 줄바꿈 처리
			line = line.replaceAll("><", ">\n<");
			
            //split으로 배열 형식으로 나누기
			String[] lines = line.split("\n");
			
			for(String data : lines) {
			if(data.trim().startsWith("<rank>") ) {
				System.out.println(
						data.trim()
						.replaceAll("<rank>", "")
						.replaceAll("</rank>", "")); //replaceAll로 rank를 지움
			}
			if(data.trim().startsWith("<movieNm>") ) {
				System.out.println(
						data.trim()
						.replaceAll("<movieNm>", "")
						.replaceAll("</movieNm>", "")); // " "
			}
			}
			
			
			
		} catch (MalformedURLException e) {
			System.out.println("[에러] : " + e.getMessage());
		} catch (IOException e) {
			System.out.println("[에러] : " + e.getMessage());
		} finally { 
			if(br != null) try { br.close(); } catch(IOException e) {}
		}
	}
}

jsoup을 사용

public static void main(String[] args) {
		// Parsing = 문서 분석
		BufferedReader br = null;
		try {
			URLConnection conn = new URL("http://kobis.or.kr/kobisopenapi/webservice
            /rest/boxoffice/searchWeeklyBoxOfficeList.xml?
            key=f5eef3421c602c6cb7ea224104795888&targetDt=20230408").openConnection();
			br = new BufferedReader(new InputStreamReader(conn.getInputStream()));

			String data = br.readLine();
			
			Document doc = Jsoup.parse(data);
			
			
			Elements rankTags = doc.getElementsByTag("rank"); 
			Elements nameTags = doc.getElementsByTag("movieNm");
			
			for(int i = 0; i < rankTags.size(); i++) {
				Element rankTag = rankTags.get(i);
				System.out.println(rankTag.text());

				Element nameTag = nameTags.get(i);
				System.out.println(nameTag.text());

			}
			
		} catch (MalformedURLException e) {
			System.out.println("[에러] : " + e.getMessage());
		} catch (IOException e) {
			System.out.println("[에러] : " + e.getMessage());
		} finally { 
			if(br != null) try { br.close(); } catch(IOException e) {}
		}
	}

}

영화정보 추출하기

open API를 이용(json)

정수형/문자열 출력

public static void main(String[] args) {
		// TODO Auto-generated method stub
		String strJson= "[8, 9, 6, 2, 9]";
		
		JSONParser parser = new JSONParser();
		
		try {
			JSONArray array = (JSONArray)parser.parse(strJson);
			
			//배열 형식으로 전체 리스트
			System.out.println(array);
			//System.out.println(array.size());
			
			//하나씩 출력
			for(int i = 0;  i < array.size(); i++) {
				//json 기본 정수형 = long
				long data = (Long)array.get(i);
				System.out.println(data);
			}
		} catch (ParseException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

}

public static void main(String[] args) {
		// TODO Auto-generated method stub
		String strJson= "[\"8\", \"9\", \"6\", \"2\", \"9\"]";
		
		JSONParser parser = new JSONParser();
		
		try {
			JSONArray array = (JSONArray)parser.parse(strJson);
			
			//배열 형식으로 전체 리스트
			System.out.println(array);
			//System.out.println(array.size());
			
			//하나씩 출력
			for(int i = 0;  i < array.size(); i++) {
				String data = (String)array.get(i);
				System.out.println(data);
			}
		} catch (ParseException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

}


객체 출력

public static void main(String[] args) {
		// 객체는 시작점이 중괄호
        // 객체로 생성
		String strJson= "{\"data1\" : \"value1\" , \"data2\" : \"value2\"}"; 
		
		JSONParser parser = new JSONParser();
		
		try {
			JSONObject obj = (JSONObject)parser.parse(strJson);
			// data1에 대한 값
			String data1 = (String) obj.get("data1"); 
			System.out.println(data1);
			// data2에 대한 값 
			String data2 = (String) obj.get("data2"); 
			System.out.println(data2);
		} catch (ParseException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

}

배열/객체 형식 출력

public static void main(String[] args) {
		//문자형은 항상 ""
		//[] = 동종 데이터 넣기
		String strJson = "[{\"name\" : \"홍길동\", \"city\" : \"서울\"}, 
        {\"name\" : \"박문수\", \"city\" : \"경기\"}]";  // 차례대로 추출
		
		JSONParser parser = new JSONParser();
		
		try {
			JSONArray arr = (JSONArray)parser.parse(strJson);
			
			System.out.println(arr.size());
			
			for(int i = 0; i<arr.size(); i++) {
			JSONObject object = (JSONObject)arr.get(i);
			
			String name = (String)object.get("name");
			
			System.out.println(name);
			
			String city = (String)object.get("city");
			
			System.out.println(city);
			}
			
		} catch (ParseException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

}

영화 정보 json으로 출력

public static void main(String[] args) {
		// Parsing = 문서 분석
		BufferedReader br = null;
		try {
			URLConnection conn = new URL(
					"http://kobis.or.kr/kobisopenapi/webservice/
                    rest/boxoffice/searchWeeklyBoxOfficeList.json?
                    key=f5eef3421c602c6cb7ea224104795888&targetDt=20230408")
					.openConnection();
			br = new BufferedReader(new InputStreamReader(conn.getInputStream()));

			String line = br.readLine();

			//차례대로 분리할 것
			JSONParser parser = new JSONParser();
			
			JSONObject root = (JSONObject) parser.parse(line);
			
			JSONObject boxOfficeResult  = (JSONObject) root.get("boxOfficeResult");
			JSONArray weeklyBoxOfficeList = (JSONArray) boxOfficeResult.get("weeklyBoxOfficeList");
			
			for(int i = 0; i < weeklyBoxOfficeList.size(); i++) {
				JSONObject weeklyBoxOffice = (JSONObject) weeklyBoxOfficeList.get(i);
				System.out.printf("%s\t%s\t%s\n",
						weeklyBoxOffice.get("rank"),
						weeklyBoxOffice.get("movieCd"),
						weeklyBoxOffice.get("movieNm"));
			}	

		} catch (ParseException e) {
			System.out.println("[에러] : " + e.getMessage());
		} catch (MalformedURLException e) {
			System.out.println("[에러] : " + e.getMessage());
		} catch (IOException e) {
			System.out.println("[에러] : " + e.getMessage());
		} finally {
			if (br != null)
				try {
					br.close();
				} catch (IOException e) {
				}
		}
	}
}

Socket - 데이터 제공

SeverSocket <- Socket
제공자용 소켓 <- Socket
1. 전송규약
2. 포트
TCP(Transmission Control Protocol) - 전화(확인/응답)
Http
UDP(User Diagram Protocol) - 방송/확인하지 않음(일방적)

서버연결

서버연결끊기 : ctrl + c
C:\Users\KITCOOP>cd c:\Java\java-workspace\SocketEx01\bin

c:\Java\java-workspace\SocketEx01\bin>java pack2.TCPServerEx01

클라이언트 서버
단수 입력 구구단 계산실행
구구단 출력

0개의 댓글