24. 네트워크 (Network) [ JAVA ]

duck-ach·2022년 8월 16일
1

JAVA

목록 보기
24/27

🌏 네트워크

네트워크는 둘 이상의 컴퓨터와 이들을 연결하는 링크의 조합이다.

  • 물리적 네트워크는 네트워크를 구성하는 하드웨어(어댑터, 케이블 및 전화선과 같은 장비)이다.
  • 논리적 네트워크는 소프트웨어 및 개념모델이다.

🌏 URL

Uniform Resource Locator

  • 정형화된 자원의 경로를 뜻한다.
  • 자원의 경로를 표기할 때 형식을 갖추어서 표기한다.
  • 웹 주소를 의미한다.

구성

프로토콜(통신규약)://호스트/서버경로?파라미터(서버경로로 보내주고싶은 데이터들)=값&파라미터

https://search.naver.com/search.naver?where=nexearch&sm=top_hty&fbm=1&ie=utf8&query=%EB%82%A0%EC%94%A8
위 주소를 보면

주소명칭
https프로토콜(통신규약)
search.naver.com호스트
search.naver서버경로
where=nexearch파라미터

구성 출력하기

try {
			
			// URL 처리를 위한 URL 클래스
			String apiURL = " https://search.naver.com/search.naver?query=날씨";
			URL url = new URL(apiURL);
			
			// URL 확인  // if(con.getResponseCode() == 200) {}; // 조건을 걸어도 된다.
			System.out.println("프로토콜 : " + url.getProtocol());
			System.out.println("호스트 : " + url.getHost());
			System.out.println("파라미터 : " + url.getQuery());
			
			
		} catch (MalformedURLException e) {
			System.out.println("API 주소 오류");
		}

🌏 HTTP 응답 상태 코드

HTTP 응답 상태 코드는 특정 HTTP 요청이 성공적으로 완료되었는지 여부를 나타낸다.

  • 정보응답 (100-199)
  • 성공적인 응답(200-299)
  • 리디렉션 메시지(300-399) (리디렉션은 방문자에게 초기에 요청한 URL이 아닌 다른 URL을 제공하는 행위)
  • 클라이언트 오류 응답(400-499)
  • 서버 오류 응답(500-599)

인터넷을 이용하다보면 종종 404 에러문구를 볼 때가 있다. 이는 클라이언트 오류 응답의 한 종류로 서버가 요청한 리소스를 찾을 수 없을 때 나타낸다.
이런 형식으로 HTTP에서는 상태에대한 정보를 코드로 나타낸다.

주요로 보아야 할것은 200번대오류와, 400번대오류, 500번대오류를 잘 보면 된다.

2xx 성공적인 응답

요청을 받았으며 프로세스를 계속 진행시킨다는 의미.

4xx 클라이언트 오류 응답

요청의 문법이 잘못되었거나 요청을 처리할 수 없다는 의미.

5xx 서버오류 응답

서버가 명백히 유효한 요청에 대한 충족을 실패했다는 의미.

🌕 JAVA로 응답코드 출력하기

HttpURLConnection클래스를 이용하여 응답코드를 출력할 수 있다.

		try {
			
			// 접속하기
			String apiURL = "https://www.google.co.kr";
			URL url = new URL(apiURL);
			// 자식커넥션 			// URL커넥션 (부모)
			HttpURLConnection con = (HttpURLConnection)url.openConnection(); 
			
			// HTTP 응답 코드
			// 1. 200 : 정상
			// 2. 40X : 요청이 잘못됨(사용자 잘못)
			// 3. 50X : 서버 오류
			
			// 접속 확인
			System.out.println("응답 코드 : " + con.getResponseCode());
			System.out.println("정상 : " + HttpURLConnection.HTTP_OK);
			System.out.println("NOT FOUND : " + HttpURLConnection.HTTP_NOT_FOUND);
			System.out.println("Internal Error : " + HttpURLConnection.HTTP_INTERNAL_ERROR);
			
			System.out.println("컨텐트 타입 : " + con.getContentType()); 	// Google : text/html; charset=ISO-8859-1 	(html, ISO-8859-1)
																			// Naver  : text/html; charset=UTF-8  		(html, utf-8)
			System.out.println("요청 방식 : " + con.getRequestMethod());  	// GET (GET POST PUT DELETE ... etc)
			
			
			// 접속 끊기
			con.disconnect(); // 접속 해제(생략 가능)
			
		} catch (MalformedURLException e) { // 주소가 잘못된 형식
			System.out.println("API 주소 오류");
		} catch (IOException e) {
			System.out.println("API 접속 오류");
			
		}

🌕 기존에 있는 웹페이지 읽어와서 출력하기

connection이라는 것은 스트림을 만들기 위한 도구이다.
Naver 메인페이지의 정보를 자바로 html파일을 만들어 파일을 저장해봅시다.

try {
			
			String apiURL = "https://www.naver.com";
			URL url = new URL(apiURL);
			HttpURLConnection con = (HttpURLConnection)url.openConnection();
		
			// 바이트 입력 스트림
			InputStream in = con.getInputStream();
			
			// 문자 입력 스트림으로 변환
			InputStreamReader reader = new InputStreamReader(in);
			
			// 모두 읽어서 StringBuilder에 저장
			StringBuilder sb = new StringBuilder();
			char[] cbuf = new char[100]; // 100글자씩 처리
			int readCnt = 0; // 실제로 읽은 글자 수
			
			while((readCnt = reader.read(cbuf)) != -1)  {
				sb.append(cbuf, 0, readCnt);
			}
			
			// StringBuilder의 모든 내용을 C:\\storage\\naver.html로 내보내기
			File file = new File("c:\\storage", "naver.html");
			FileWriter fw = new FileWriter(file);
			
			// 내보내기
			fw.write(sb.toString());
					
			fw.close();
			reader.close();
			con.disconnect();
			
		} catch (MalformedURLException e) {
			System.out.println("주소 오류");
		} catch (IOException e) {
			System.out.println("API 접속 및 연결 오류");
		}
	}
	
	// server -> client = in Stream(바이트 기반 스트림)
	// client -> server = out Stream(바이트 기반 스트림)

🌏 인코딩(encoding)과 디코딩(decoding)

  • 인코딩(Encoding) : UTF-8 방식으로 암호화 하는 것을 말한다.
  • 디코딩(Decoding) : UTF-8 방식으로 복호화 하는 것을 말한다.
    순서 : 원본데이터 -> 인코딩 -> 전송 -> 디코딩 -> 원본데이터

우리 웹페이지의 주소에도 %&이 있는 경우가 있는데, 이것은 복호화 되어있는 코드이다.
우리가 데이터를 이용하여 웹페이지를 생성할 때도 인코딩과 디코딩을 활용하여 데이터를 다루어야 하므로 잘 알아두자.

try {
			
			// 원본데이터
			String str1 = "한글 english !@#$+";
			
			// 인코딩
			String encode = URLEncoder.encode(str1, "UTF-8");
			System.out.println(encode); // %ED%95%9C%EA%B8%80+english+%21%40%23%24%2B
			// 영어와 숫자는 그대로 출력되고, 한글과 특수기호는 암호화되고, 공백은 + 기호로 바뀌었다.
			
			// 디코딩
			String decode = URLDecoder.decode(encode, StandardCharsets.UTF_8);
			System.out.println(decode);
			
			
			
		} catch (UnsupportedEncodingException e) { // 오타났을때 쓰는 예외처리
			e.printStackTrace();
		}

이렇게 한글과 특수기호, 공백을 같이 함께 정상적으로 원본대로 출력하기 위해서 encoding과 decoding을 한다.
API문서를 읽을 때도 한글은 인코딩을 해주어야 정상적으로 읽힌다.

[부록] 유니코드

  • UTF-8 : 하나의 문자를 1~4바이트의 가변길이로 표현된다. 1바이트 영역은 ASCII코드와 하위 호환되며 ASCII코드의 128개 문자 집합은 UTF-8과 동일하게 호환된다. 현재 인터넷에서 가장 많이 쓰이는 인코딩이며 뛰어난 크로스플랫폼 호환성도 갖고 있다,
  • UTF-16 : 모든 문자를 2바이트의 고정크기로 표현하고 UTF-8과 마찬가지로 ACII코드의 128개 문자 집합에 대해 호환성을 가진다. 바이트 순서가 정해지지 않아 리틀/빅 엔디안 문제가 발생하기 때문에 인터넷 상에서의 사용을 권고하지 않는다. Java와 .NET Framework의 기본 인코딩이다.
profile
자몽 허니 블랙티와 아메리카노 사이 그 어딘가

1개의 댓글

comment-user-thumbnail
2022년 8월 16일

정말 대단해요👍

답글 달기