forDevLife
[자바의정석]Chapter 16. 네트워킹 본문
1. 네트워킹
두 대 이상의 컴퓨터를 케이블로 연결하여 네트워크를 구성하는 것을 말한다.
java에서 제공하는 java.net 패키지를 사용하면 이러한 네트워크 어플리케이션의 데이터 통신 부분을 쉽게 작성할 수 있다.
1.1 클라이언트 / 서버
- 서비스 : 서버가 클라이언트로부터 요청받은 작업을 처리, 그 결과를 제공하는 것. 서버가 제공하는 서비스 종류로 구분된다.
- 서버가 서비스를 제공하기 위해서, 서버 프로그램 필요 / 마찬가지로 클라가 서비스를 제공받기 위해서는 서버 프로그램과 연결될 수 있는
클라이언트 프로그램 필요
- 예를 들어, 웹서버에 접속하기 위해서 웹브라우저(클라이언트 프로그램) 필요
- 또한, FTP 서버에 접속해서 파일을 전송받기 위해서는 알FTP 같은 FTP 클라이언트 프로그램이 필요.
- 일반 pc에도 tomcat 같은 웹서버 프로그램 설치하여 서버 역할 수행 가능
- 서버 기반 모델(server-based model) : 네트워크를 구성할 때 전용 서버를 두는 것
- P2P 모델(peer-to-peer model) : 별도 전용 서버 없이 각 클라이언트가 서버 역할을 동시에 수행하는 것
1.2 IP 주소
- 컴퓨터(호스트, Host)를 구별하는데 사용되는 고유한 값. 모든 컴퓨터는 IP 주소를 가짐.
- 네트워크 + 호스트 주소로 이루어져 있으며, 네트워크를 어떻게 구성했냐에 따라 차지하는 bit가 달라짐
- 두 호스트가 같은 네트워크에 연결되어 있을 경우, 네트워크 주소는 같다.
- 서브넷 마스크를 통해 네트워크 / 호스트 주소를 구분한다.
-. 서브넷 마스크 주소와 IP주소를 & 연산한 값이 네트워크 주소, 나머지가 호스트 주소이다.
- 네트워크 주소가 많이 차지할 수록, 호스트 주소의 범위가 줄어들어, 네트워크의 규모가 작아진다.
-. 서브넷 마스크가 255.255.255.0 일 경우, 호스트 주소번호는 0에 해당하는 256개이다.
-. 이 와중에도 0:네트워크 자신, 255:브로드캐스트 주소이므로, 실제 사용가능한 수는 254개이다.
1.3 InetAddress
- 자바에서는 IP주소를 다루기 위한 클래스로 InetAddress를 제공한다.
-. getByName : 전달된 도메인 명에 대한 IP정보를 InetAddress class 객체로 반환한다. 이를 이용하여 name, address를 알 수 있다.
-. getLocalHost : 자신 컴퓨터의 호스트 명과 IP주소를 알 수 있다.
-. getAllByName : 전달된 도메인 명에 대한 모든 IP주소를 얻을 수 있다. 배열 형태로 얻어진다.
1.4 URL(Uniform Resource Locator)
- URL은 인터넷에 존재하는 여러 서버들이 제공하는 자원에 접근할 수 있는 주소를 표현하기 위한 것이다.
- '프로토콜://호스트명:포트번호/경로명/파일명?쿼리스트링#참조"의 형태로 이루어져 있다.(포트번호, 쿼리, 참조 생략 가능)
- 자바에서는 URL을 다루기 위한 URL클래스를 제공한다.
* URL / URI ?
- URL : Uniform Resource Locator : 네트워크 상에서 자원이 어디 있는지 알려주기 위한 규약
- URI : Uniform Resource Identifier : 인터넷에 있는 자원을 나타내는 유일한 주소. URL의 상위 개념이다.
위의 예시에서,
http://www.codechobo.com:80/sample/hello.html 까지는 위치를 표현한 URL(또는 URI 성립),
뒤에 ?refer=codechobo#index1은 hello.html내에서 쿼리(? 부분)와 참조(# 부분)을 이용하여 식별하는 부분이므로 URI(URL는 아님)
참조 : velog.io/@jch9537/URI-URL
1.5 URLConnection
이는 애플리케이션과 URL간의 통신 연결을 나타내는 클래스의 최상위 클래스로, 추상클래스이다. 상속 받은 클래스는 아래와 같다.
- HttpURLConnection
- JarURLConnection
- 앞서 배운 URL 클래스의 메서드인 openConnection()을 통해, URLConnection instance를 반환할 수 있다.
-. 예를 들어, URL의 프로토콜이 http라면, openConnection()은 HttpURLConnection을 반환한다.
- 이를 사용해서 연결하고자 하는 자원에 접근하고 읽고/쓰기를 할 수 있다.
+ 깃허브 - setting - page에서 none > master로 바꾸면 깃허브에서 제공되는 호스팅 서비스를 이용할 수 있다.
html 예문을 여기에 올려서 서비스 한 후, 자바 프로그래밍을 통해서 html 코드를 불러왔다.
웹 상에서도 해당 html에 들어가면 코드가 아닌 서비스 화면을 볼 수 있다.
+ 호스팅 서비스 종료 시(master > none) 약 5분 정도 후부터 java에서 소스코드가 불러지지 않는다.
+ 브라우저에서는 호스팅 종료 시 바로 해당 html 서비스 화면을 볼 수 없다.
+ 아래 두 코드는 완전히 동일한 역할을 한다.
1) 위 코드는 url.openConnection > getInputStream을 호출하여 InputStream을 얻는 방식으로 구현
2) 아래 코드는 url에서 바로 openStream을 호출하여 InputStream을 얻는다.
즉, openStream == openConnection + getInputStream 과 동일한 역할을 한다.
try {
url = new URL(address);
URLConnection conn = url.openConnection();
InputStream in = conn.getInputStream();
input = new BufferedReader(new InputStreamReader(in));
while((line=input.readLine()) != null) {
System.out.println(line);
}
input.close();
} catch(Exception e) {
e.printStackTrace();
}
try {
url = new URL(address);
input = new BufferedReader(new InputStreamReader(url.openStream()));
while((line=input.readLine()) != null) {
System.out.println(line);
}
input.close();
} catch(Exception e) {
e.printStackTrace();
}
마지막 코드는, github에서 html코드를 불러온 후, setOut을 통해 출력 대상을 콘솔이 아닌 임의 지정 파일로 변경한 코드이다.
ps(보조 스트림)를 통해 입출력 대상을 'hello_copy.html'로 변경하였다.
이렇게 되면 콘솔에 출력되던 html 코드가 PC내로 복사가 된다.
package networking;
import java.io.*;
import java.net.*;
public class NetworkEx5 {
public static void main(String[] args) {
URL url = null;
BufferedReader input = null;
FileOutputStream out = null;
PrintStream ps = null;
String address = "https://leejohy-0223.github.io/hello-world/hello.html";
String line ="";
try {
url = new URL(address);
input = new BufferedReader(new InputStreamReader(url.openStream()));
out = new FileOutputStream("hello_copy.html");
ps = new PrintStream(out);
System.setOut(ps);
while((line=input.readLine()) != null ){
System.out.println(line);
}
input.close();
out.close();
} catch(Exception e) {
e.printStackTrace();
}
}
}
아래와 같이, FileWriter를 쓰는게 기본이긴 하다.
텍스트 데이터를 다룰 때, 한글 등을 표현하기 위해서는 FileReader / Writer를 사용한다.
바이너리 파일을 다룰 때는, FileInput / OutputStream을 사용한다. 이들은 한글을 입/출력 시 깨진다.
package networking;
import java.io.*;
import java.net.*;
public class NetworkEx5 {
public static void main(String[] args) {
URL url = null;
BufferedReader input = null;
PrintStream ps = null;
FileWriter fw = null;
String address = "https://leejohy-0223.github.io/hello-world/hello.html";
String line ="";
try {
url = new URL(address);
input = new BufferedReader(new InputStreamReader(url.openStream()));
fw = new FileWriter("hello_copy2.html");
System.setOut(ps);
while((line=input.readLine()) != null ){
fw.write(line);
fw.write("\n");
}
input.close();
fw.close();
} catch(Exception e) {
e.printStackTrace();
}
}
}
'Java' 카테고리의 다른 글
[java] 익명 클래스(anonymous class) (0) | 2021.05.28 |
---|---|
[java] 디폴트 메서드, static 메서드 (0) | 2021.05.28 |
[자바의정석]Chapter 15. 입출력 I/O - 2 (0) | 2021.04.14 |
[자바의정석] Chap 15. 입출력 I/O (0) | 2021.03.25 |
[자바의정석] Chap 13. 쓰레드 (0) | 2021.03.16 |