[Java] 네트워킹 (Networking) 1
컴퓨터간의 관계를 서버와 클라이언트로 구분할 수 있다. 서비스를 제공하는 쪽이 서버이고 제공받는 쪽이 클라이언트가 된다. 하나의 서버가 여러 가지 서비스를 제공하기도 하고, 하나의 서비스를 여러 대의 서버로 제공하기도 한다.
서버는 서버 일만, 클라이언트는 클라이언트의 일만 하는 모델을 서버기반 모델이라고 한다.
파일 공유 시스템(Torrent)에서 많이 사용하는 모델으로 P2P 모델이 있다. 각각의 클라이언트들이 서버의 역할도 수행하는 모델이다.
우리는 보통 클라이언트의 역할을 한다.
서버에 접속하기 위해서는 특별한 경로, 특별한 식별자가 필요한데 이를 IP주소라고 한다.
이 IP주소를 바탕으로 컴퓨터들을 구분한다.
IP주소는 4바이트와 6바이트로 나타낼 수 있는데, 원래는 4바이트를 많이 사용했는데 요즈음 컴퓨터가 너무 많아져서 6바이트가 도입됐다. 일단 4바이트의 IP주소에 대해서 공부하자.
4바이트의 경우 위에서 볼 수 있듯 네 가지의 숫자로 표현된다. (1바이트. 0~255) 앞의 세 숫자는 네트워크 주소를 의미하고(어느 그룹에 속해있는지), 마지막 숫자는 호스트 주소를 의미한다.
IP주소와 서브넷마스크(255 255 255 0)를 & 연산하면 네트워크 주소를 얻는다. (아이피 주소 세 숫자만 살아남음)
자바에서 IP주소를 다룰 때 사용하는 클래스이다. (InetAddress 클래스)
외우지 말고... 메서드 이름이 직관적인 경우가 많으니 메서드 이름을 바탕으로 결과를 예측하는 방법으로 사용하자.
예제를 통해 살펴보자.
ip.getadress 메서드로 4바이트의 ip 주소를 바이트 배열에 저장한 다음 출력하면 음수로 나온다. 2진수를 표현할 때 맨 앞쪽이 음수로 나오기 때문이다. 실제로 1바이트는 -128~127을 표현할 수 있다. (보수표현)
그러므로 일반적인 컴퓨터에서 주소를 제대로 확인하기 위해서는 4바이트의 ip주소를 배열에 저장한 다음 256을 더해서 표현한다. (양수로 변환)
getLocalHost에서 LocalHost는 내컴퓨터를 의미한다.
하나의 호스트에 대해서 여러 개의 ip주소가 대응이 될 수 있다. 이 때 getAllByName 메서드를 이용한다.
하나만 추출하려면 getByName 다 추출하려면 getAllByName을 사용하자.
URL 클래스
(Uniform Resource Location) 인터넷 주소라고 받아들이자. URL을 다루기 위한 클래스로 URL 클래스가 있다.
인터넷 주소는 위와 같은 형식으로 구성되어있다.
프로토콜 : 웹에 접속하기 위해서 어떤 통신 방식을 사용하나?
호스트명 : 서버의 이름 (getByName으로 이름을 얻을 수 있음. 호스트 이름에 대응됨)
포트번호 : 접속하기 위한 포트이다.
경로명, 파일명 : 파일 탐색기와 동일하게 받아들이자.
쿼리 : ? 이후의 부분이다. ?는 쿼리를 요청함. 특정 조건을 요청한다. 특정 자료에 접근하기 위해 사용함.
참조 : 쿼리에 해당하는 페이지가 있으면 #과 함께 anchor가 설정된다. 나무위키의 인덱스 기능을 생각하자.
URL Connection 클래스
그 페이지의 정보를 가져올 때 URL의 주소만 가져오면 도움이 되지 않는다. 실제로 그 내용과 연결해야 한다. (ex. 웹 크롤링) URL Connection 클래스는 어플리케이션과 URL간의 통신연결을 나타내는 클래스이다.
URL 자체를 다루는 클래스는 URL 클래스이고, URL에서 서버에 접속하게 하는 클래스는 URLConnection 클래스이다.
특정 쿼리를 보내 (요청을 보내) 데이터를 읽고 쓰는게 가능하다.
이 클래스의 메서드들은 필요할 때 찾아서 사용하자. (연습하기)
읽어올 때는 inputStream, 쓸 때는 outputStream을 사용한다. 두 통로를 합쳐서 openStream()으로 사용할 수 있다.
inputStream은 바이트 기반 스트림인데, BufferedReader는 문자 기반 스트림이다. 바이트 기반 스트림을 문자 기반 스트림으로 바꿔준 다음 그 문자 기반 스트림의 보조 스트림으로 BufferedReader사용할 수 있다.
InputStreamReader(url.openStream())을 통해 바이트 기반 스트림을 문자 기반 스트림의 Reader로 바꿔줬다. (Reader 붙으면 문자 기반임)
위를 통해 웹페이지에서 필요한 자료를 가져올 수 있고, 특정 자료를 바꾸고 싶을 때는 outputStream을 사용해서 쿼리를 보내고 쿼리 결과를 가져와 프로그래밍 해야 한다.
'Programming Language > Java' 카테고리의 다른 글
자바 예외 이해하기 (0) | 2022.09.03 |
---|---|
[Java] 네트워킹 (Networking) 2 (0) | 2021.12.13 |
[Java] 입출력 (I/O) 2 (0) | 2021.11.29 |
[Java] 입출력 (I/O) 1 (0) | 2021.11.21 |
[Java] 쓰레드 (Thread) 2 (0) | 2021.11.12 |
댓글
이 글 공유하기
다른 글
-
자바 예외 이해하기
자바 예외 이해하기
2022.09.03 -
[Java] 네트워킹 (Networking) 2
[Java] 네트워킹 (Networking) 2
2021.12.13 -
[Java] 입출력 (I/O) 2
[Java] 입출력 (I/O) 2
2021.11.29 -
[Java] 입출력 (I/O) 1
[Java] 입출력 (I/O) 1
2021.11.21