Java공부(코딩)

코딩초보의 자바(JAVA)공부 32일차 { 네트워크 }

동곤일상 2025. 1. 20. 14:08
반응형
자료를 찾다가
네트워크 단원이 보여
네트워크까지 다뤄볼려고합니다!!

1.네트워크의 기본 개념

▪ 네트워크
 데이터를 주고 받을 수 있는 컴퓨터들과 주변 장치들의 집합


▪ 노드
 네트워크에 연결된 모든 장치들


▪ 호스트
노드 중에서 애플리케이션을 실행할 수 있는
컴퓨팅 시스템을 갖춘 장치(PC, 노트북, 스마트폰 등


서버와 클라이언트

▪ 서버(Server)
• 네트워크에서 데이터나 서비스를 제공하는 컴퓨터
• 제공하는 서비스에 따라서 웹 서버, 파일 서버, DB 서버
등으로 구분할 수 있음


▪ 클라이언트(Client)
• 서버의 서비스를 이용하는 컴퓨터


IPV4

▪ IP version 4
▪ 32비트 숫자로 구성된 주소 체계
▪ 8비트 숫자(10진수로 표기, 0-255) 4개와 마침표(.)로 주소를 구성함
• 0.0.0.0 ~ 255.255.255.255 사이 조합이 가능함
▪ IP 주소를 이용하여 모든 호스트를 구분하므로 모든 호스트는 고유의 IP 주소를 가져야 함
▪ 현재 IPv4는 포화 상태로 이를 해결하기 위한 IPv6가 존재함

 


 

IPV6

▪ IP version 6
▪ IPv4의 주소 고갈 문제를 해결하기 위해 나타남
▪ 128비트 숫자로 구성된 주소 체계
▪ 16비트 숫자 8개(16진수로 표기)와 콜론(:)으로 주소를 구성함
• 예시) FE80:6E78:E1D2:C35D:FECD:BA98:7652:EABF

 


도메인과 DNS

▪ 도메인
• 외우고 다니기 어려운 IP 주소 대신 사용하는
네트워크 호스트 이름
• http://www.google.com처럼 문자로 구성되어 있음


▪ DNS
• Domain Name System
• 도메인을 IP 주소로 바꿔서 호스트를 찾아갈 수 있게 하는 시스템


포트

▪ 논리적인 통신 연결 번호
▪ 특정 프로세스나 서비스에 연결하기 위한 연결 번호
▪ 컴퓨터에서 서로 다른 종류의 트래픽을 구분하기 위한 연결 번호
▪ 포트번호는 임의로 사용할 수는 있지만 예약된 번호를 사용하게 되면통신에 문제가 될 수 있음
▪ 0-65,535 사이 번호를 가짐

 

▪ 포트 번호 사용 영역

1. 0-1,023
• 잘 알려진 포트 (well known port)
• 예약된 영역
• root 권한(관리자 권한)으로 bind 할 수 있음


2. 1,024-49,151
• 등록된 포트 (registered port)
• 일반 유저 권한으로 bind 할 수 있음


3. 49,152-65,535
• 동적 포트 (dynamic port)
• 서버-클라이언트 통신 시 자동으로 bind 되는 영역

 

 


▪ HTTP
• Hyper Text Transfer Protocol
• 하이퍼텍스트 전송 프로토콜
• 웹 문서인 HTML 문서를 전송하는 프로토콜
• 암호화되지 않는 평문으로 데이터를 전송함


▪ HTTPS
• HTTP Secure
• 보안 처리된 HTTP
• SSL(Secure Sockets Layer)을 이용해서 보안 처리함
• SSL 인증서 발급에는 소정이 비용이 소요됨
• 암호화된 데이터를 전송하기 때문에 보안이 우수함

 


▪ URI
• Uniform Resource Identifier
• 통합 자원 식별자
• 어떤 자원을 식별할 수 있는 고유의 문자열을 의미함


▪ URL
• Uniform Resource Locator
• 통합 자원 위치 정보
• 어떤 자원이 어디 있는지를 표시한 문자열로 URI의 일종임

 

OSI 7계층

 

TCP/IP 4계층


 자바 네트워크 API 

 

1.Java.net 패키지

▪ 네트워크 애플리케이션 구현을 위한 클래스를 제공하는 패키지
▪ 네트워크 리소스에 보다 쉽게 접근하기 위한 High Level 추상화 클래스를 제공함
• InetAddress 클래스
• URI 클래스
• URL 클래스
• URLConnection 클래스
• HttpURLConnection 클래스

 

InetAddress 클래스

▪ IP 주소와 호스트 이름을 관리하는 클래스
▪ public 생성자를 지원하지 않고 객체 생성을 위한 static 메소드를 지원함
▪ 자바 프로그램을 작성할 때 IP 주소가 필요한 경우에는 InetAddress 클래스를 활용함

 

▪ InetAddress 객체 생성을 위한 정적 메소드

static InetAddress[] getAllByName(String host)
throws 
UnknownHostException  :   String host에 대응하는 InetAddress[] 배열 반환


static InetAddress getByAddress(byte[] addr)
throws UnknownHostException  :   byte[]addr에 대응하는 InetAddress 객체 반환


static InetAddress getByAddress(String host, byte[] addr)
throws
UnknownHostException :   String host와 byte[] addr에 대응하는 InetAddress 객체 반환


static InetAddress getByName(String host)
throws
UnknownHostException :    String host(도메인)에 대응하는 InetAddress 객체 반환


static InetAddress getLocalHost()
throws
UnknownHostException  :    localhost의 InewAddress 객체 반환


▪ InetAddress 클래스 주요 메소드

byte[] getAddress()  :  InetAddress객체의 실제 IP 주소를 byte[] 배열로 반환
String getHostAddress()  : IP 주소를 문자열로 반환
String getHostName()  : IP 주소에 대응하는 호스트(도메인) 이름을 문자열로 반환
String toString()   :  "호스트/IP 주소" 형식의 문자열을 반환


▪ InetAddress 클래스를 이용한 호스트 정보 확인하기

package network.pkg01_InetAddress;

import java.net.InetAddress;
import java.net.UnknownHostException;
import java.security.Identity;


public class MainClass {
	public static void main(String[] args) {
		//InetAddress클래스 : ip주소를 추상화한클래스
		//도메인을 이용한 InerAddress객체생성
		try {
			InetAddress iAddr = InetAddress.getByName("www.google.com");
			System.out.println("호스트주소(IP) : "+iAddr.getHostAddress());
			System.out.println("호스트이름(도메인) : "+iAddr.getHostName());
		} catch (UnknownHostException e) {
			e.printStackTrace();
		}
		System.out.println();
		//IP주소를이용한 InetAddress객체생성
		try {
			byte[] ip = {(byte)142, (byte)250, 76, 4};
			InetAddress iAddr2 = InetAddress.getByAddress(ip);
			System.out.println("IP(주소) : "+iAddr2.getHostAddress());
			System.out.println("도메인(이름) : "+iAddr2.getHostName());
		} catch (UnknownHostException e) {
			e.printStackTrace();
		}

	}

}

호스트주소(IP) : 142.250.199.68

호스트이름(도메인) : www.google.com

IP(주소) : 142.250.76.4

도메인(이름) : nchkga-ac-in-f4.1e100.net

 

byte의 범위가 -128~~127 이기떄문에

위와 같은 142 , 250을 표현할 수 없다 

그래서(byte)142 와 같이 강제형변환을 시도

 


2.URL클래스

▪ World Wide Web의 리소스(자원)에 대한 포인터를 나타냄


▪ 파일/디렉터리처럼 단순한 리소스나 데이터베이스/검색엔진에 대한

쿼리처럼 복잡한 리소스 모두 가능함


▪ 잘못된 URL을 이용해 URL 객체를 생성하면
MalformedURLException 예외가 발생함


▪ URL 클래스 주요 생성자


URL(String spec)
throws MalformedURLException : String URL 구문을 이용해 URL 객체를 생성


URL(String protocol, String host, String file)
throws MalformedURLException : String 프로토콜, 호스트, 파일을 이용해 URL 객체를 생성


URL(String protocol, String host, int port, String file)
throws MalformedURLException : String 프로토콜, 호스트, 파일과 int 포트번호를 이용해URL 객체를 생성


URL클래스 주요 메서드

String getProtocol()  : URL의 프로토콜을 반환
String getHost()  : URL의 호스트를 반환
String getPort() :  URL의 포트번호를 반환
String getPath()  : URL의 경로를 반환
String getQuery()  : URL의 쿼리를 반환
String getFile()  : URL의 파일(경로 + 쿼리)을 반환


URLConnection openConnection()
throws IOException  : URL이 참조하는 원격 개체에 대한 연결을 나타내는 URLConnection 객체를 반환


final InputStream openStream()
throws IOException  : URL에 대한 연결을 열고 해당 연결을 읽기 위한 InputStream 객체를 반환


URL 클래스 활용

package network.pkg02_URL;

import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;

public class MainClass {
	public static void main(String[] args)  {
		//URL클래스 : URL 처리를 위한 클래스
		//접속 주소(가상)
		String spec = "https://www.example.com:9090/board/view.html?no=1&week=mon#footnote";
		String a = "protocol://host:port/path?query#reference";
		
		try {
			URL url = new URL(spec);
			System.out.println("getProtocol : "+url.getProtocol());
			System.out.println("getDefaultPort : "+url.getDefaultPort());//기본포트번호
			System.out.println("getHost : "+url.getHost());
			System.out.println("getPort : "+url.getPort());
			System.out.println("getPath : "+url.getPath());
			System.out.println("getQuery : "+url.getQuery());
			System.out.println("getFile :"+url.getFile());//path+query
			System.out.println("getRef : "+url.getRef());
			
			
			//MalformedURLException : 주소 잘못 입력시 오류
			
		} catch (MalformedURLException e) {
			e.printStackTrace(); //오류문출력
			System.out.println("잘못된 주소에요");
		}
	}
}

getProtocol : https

getDefaultPort : 443

getHost : www.example.com

getPort : 9090

getPath : /board/view.html

getQuery : no=1&week=mon

getFile :/board/view.html?no=1&week=mon

getRef : footnote

 


3.URLConnection 클래스

▪ 응용 프로그램과 URL 간의 통신 링크를 나타내는 모든 클래스들의 슈퍼 클래스
▪ URL에서 참조하는 리소스를 읽고 쓸 수 있는 클래스
▪ URL 객체로부터 URLConnection을 얻을 수 있음

 

 

void addRequestProperty(String key, String value) 

요청 속성을 key-value 형식으로 등록


Map<String, List<String>> getRequestProperties()

 모든 요청 속성을 Map<String, List<String>> 형식으로 반환


String getRequestProperty(String key) 

요청 속성 중 key 값을 가진 value 반환


abstractvoid connect()

 URL이 참조하는 리소스에 대한 통신 링크 열기


InputStream getInputStream() 

open connection으로부터 InputStream 객체 얻기


OutputStream getOutputStream()

 open connection으로부터 OutputStream 객체 얻기


void setDoOutput(Boolean dooutput)

 dooutput이 true이면 애플리케이션이 URL 연결에 데이터를 쓸 수 있음


HttpURLConnection 클래스

▪ HTTP 관련 기능을 지원하는 URLConnection 클래스의 서브 클래스
▪ 각종 응답 코드(Response Code)를 필드 값으로 가지고 있어 응답 여부에 따른 코드 작성이 가능함

 

응답코드 의미 필드
200  

정상 응답 HttpURLConnection.HTTP_OK
404  페이지 없음  HttpURLConnection.HTTP_NOT_FOUND
 
500 내부 서버 오류  HttpURLConnection.HTTP_INTERNAL_ERROR

 

▪ HttpURLConnection 클래스를 활용해 연결된 URL로부터 접속정보를
확인하거나 수정할 수 있음


▪ 접속 정보로부터 InputStream을 얻어낸 뒤 데이터를 읽어들일 수 있음


▪ 접속 정보로부터 Reader를 얻어낼 수는 없으므로 텍스트 정보를 읽어야
하는 경우에는 InputStream을 얻어낸 뒤 이를 InputStreamReader로
변환해서 사용해야 함

 

메소드  역할
abstract void disconnect() 

연결 닫기. 곧 서버에 대한 다른 요청이 없음을 의미함
다른 요청을 만들기 위해서 disconnect() 메소드를 호출하면 안 됨
InputStream getErrorStram()  connection이 실패하였으나 서버가 데이터를 보냈다면 해당 데이터를
읽을 수 있는 오류 스트림 반환
String getRequestMethod()  요청 메소드 반환
int getResponseCode()  응답 코드 반환
void setRequestMethod(String method)  요청 메소드 설정
(GET, POST, HEAD, OPTIONS, PUT, DELETE, TRACE 중 선택)

▪ HttpURLConnection 클래스를 이용한 접속 정보 확인하기

package network.pkg03_HttpURL;

import java.io.IOException;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLConnection;

public class MainClass {
	public static void main(String[] args) {
		try {
		URL url = new URL("https://www.google.com/");
	
		HttpURLConnection con = (HttpURLConnection)url.openConnection(); 
		//URLConnection--> HttpURLConnection
		
		System.out.println(con.getResponseCode());//응답코드반환
		System.out.println(con.getRequestMethod());//요청메서드반환
		System.out.println(con.getRequestProperty("User-Agent"));//해당key를가진 속성반환
		con.disconnect();//연결닫기
		} catch(IOException e) {
        //파일을 열거나 읽거나 쓸 때, 네트워크와의 통신 시, 
			//입출력 작업을 수행하는 도중에 오류가 발생하는 경우 등에 발생
		e.printStackTrace();
		}
		}


}

200

GET

Java/17.0.9

 

url.openConnection();URLConnection 로반환됨

그의 자식인 HttpURLConnection 를 사용해야 하므로

다운캐스팅!!!!


URL 인코딩과 디코딩


URL Encoding
웹 상에서 문자열을 안전하게 전송할 수 있는 형식으로 바꾸는 것을 의미함
•"application/x www form urlencoded" 형식을 따름
권장하는 인코딩 방식은 UTF 8 방식임

 


URL Decoding
URL Encoding 된 문자를 다시 원래의 문자로 되돌리는 것을 의미함

 

URL Encoder 클래스

URL Encoding 을 위한 자바 유틸리티 클래스

 

인코딩 방식
•"A Z", "a z", "0 9" 그대로 사용
• 특수문자 ".", "--", "*", 그대로 사용

• 공백 " 은 "+" 기호로 변환다른 모든 문자는 바이트로 변환한 뒤 3 자리 문자열 "%xy" 방식으로 변환
(xy 는 변환된 바이트의 16 진수 표현법

 

URL Encoder 클래스-메서드

URL Encoder 객체생성없이 사용할 수 있는 static메서드존재

메서드 의미
static String encode(String s, String enc)
throws UnsupportedEncodingException 
String s를 명시된 String enc 방식으로 인코딩한 문자열을 반환
static String encode(String s, Charset charset)  String s를 명시된 Charset charset 문자셋으로 인코딩한 문자열을 반환

 


URLDecoder 클래스

인코딩된 데이터를 다시 원래의 값으로 되돌리는 디코딩을 위한 자바
유틸리티 클래스

(URLEncoder--> 원본)

 

URLDecoder 클래스 - 메서드

메서드 의미
static String decode(String s, String enc)
throws UnsupportedEncodingException 
String s를 명시된 String enc 방식으로 디코딩한 문자열을 반환
static String decode(String s, Charset charset)  String s를 명시된 Charset charset 문자셋으로 디코딩한 문자열을 반환

 

 


URLEncoder , URLDecoder 클래스 활용

 

package network.prk04_URLDecoder_Encoder;

import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import java.net.URLEncoder;
import java.nio.charset.Charset;

public class MainClass {
	public static void main(String[] args) {
		
		try {
			String s = "HI everyone!!!78((@";
			System.out.println("원본 : "+s);
			String encode = URLEncoder.encode(s,"UTF-8");
			System.out.println("encode : "+encode);
			String decode = URLDecoder.decode(s,"UTF-8");
			System.out.println("decode : "+decode);
		} catch (UnsupportedEncodingException e) {
			//잘못된 인코딩이름을지정하거나 하면 예외발생
			
			e.printStackTrace();
		}
	}
}

원본 : HI everyone!!!78((@

encode : HI+everyone%21%21%2178%28%28%40

decode : HI everyone!!!78((@