Notice
Recent Posts
Recent Comments
Link
«   2024/09   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
Tags
more
Archives
Today
Total
관리 메뉴

forDevLife

[자바의정석]Chapter 16. 네트워킹 본문

Java

[자바의정석]Chapter 16. 네트워킹

JH_Lucid 2021. 4. 19. 17:17

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();
		}
	}

}
Comments