본문 바로가기
코딩수업/AWS 클라우드환경 네이티브

8/25 자바(Java) IP Address, URL, InetAddress 클래스, URL 클래스, Socket programming, TCP/UDP

by 인생즐겜러 2022. 8. 25.
728x90
반응형

AWS 클라우드환경 네이티브 수업 69일차

 

 

 

진행

1. IP Address

2. URL

3. InetAddress 클래스

4. URL 클래스

5. Socket programming

6. TCP/UDP

7. 채팅 프로그램 만들기

 

 

 

 

 

요약

1. IP Address

2. URL

3. InetAddress 클래스

4. URL 클래스

( 특정 URL에서 각종 정보 가져오기, 페이지 html 소스 가져오기,  페이지 html 소스를 파일로 만들기)

5. Socket programming

6. TCP/UDP

 

 

 

 

 


 

 

 

 

 

IP Address ( Internet Protocol address )

 

컴퓨터 네트워크에서 장치들이 서로를 구별하고 통신을 하기 위해서 사용하는 고유한 번호.

 

 

 

● IP version 4 주소

일반적으로 사용하는 IP 주소이다. 주소의 범위는 십진수로 0.0.0.0부터 255.255.255.255까지 사용한다.

이론적으로 42억9496만7296개의 IP가 존재한다.

a.b.c(네트워크주소).d(호스트주소) 이다.

같은 호스트는 같은 네트워크에 존재하며 IP주소와 Subnetmask를 & 연산을 하면 네트워크 주소를 구하게 된다.

중간의 일부 번호들은 특별한 용도를 위해 예약되어 있다.

127.x.x.x는 localhost(로컬 호스트)로 자기 자신을 가리킨다.

 

 

 

●  IP version 6 주소

32비트로는 주소가 부족해짐에 따라 새로운 버전에서는 주소 길이를 128비트로 늘렸다.

IPv6 주소는 보통 두 자리 16진수 여덟 개를 쓰고 각각을 : 기호로 구분한다.

 

 

 

 

 


 

 

 

 

 

URL ( Uniform Resource Locato )

 

네트워크 상에서 자원이 어디 있는지를 알려주기 위한 규약.

웹 사이트 주소뿐만 아니라 컴퓨터 네트워크상의 자원을 모두 나타낼 수 있다.

그 주소에 접속하려면 해당 URL에 맞는 프로토콜을 알아야 하고, 그와 동일한 프로토콜로 접속해야 한다.

FTP는 FTP 클라이언트HTTP는 웹 브라우저, 텔넷은 텔넷 프로그램을 이용해서 접속해야 한다.

 

 

 

예)

https://news.naver.com:80/main/hotissue/read.nhn?mid=hot&sid1=100&cid=1082265&iid=2798622&oid=001&aid=0010346029&ptype=052

 

프로토콜 : 자원에 접근하기 위해 서버와 통신하는데 사용되는 규약

=> http, https

호스트명 : 자원을 제공하는 서버의 이름

=> news.naver.com

포트번호 : 통신에 사용되는 서버의 포트번호

=> 80

경로명 : 접근하려는 자원이 저장된 서버상의 위치

=> main/hotissue/

파일명 : 접근하려는 자원의 이름

=> read.nhn

query : URL에서 ?이후의 부분

참조(anchor) : URL에서 #이후의 부분

 

 

 

 

 


 

 

 

 

 

InetAddress 클래스

 

자바에서 IP 주소를 표현할때 사용하는 클래스. 

 

 

 

주요 메소드는 아래와 같다.

 

반환형 메소드 설명
byte[] getAddress() InetAddress 객체의 실제 IP 주소를 바이트 배열로 리턴한다.
String getHostAddress() IP 주소를 문자열로 반환한다.
getHostName() 호스트 이름을 문자열로 반환한다.
toString() IP 주소를 String 문자열로 오버라이딩한 메소드.
문자열의 형식은 '호스트이름 / IP주소'
 ex) www.google.com/142.250.204.68

 

 

 

 

 

아래의 예를 보면서 이해해보자.

 

package Network;

import java.net.*;
import java.util.*;


public class Lecture {

	public static void main(String[] args) {
		
		InetAddress		ip		= null;
		InetAddress[]	ipArr	= null;
		
		try {
			ip = InetAddress.getByName("www.naver.com");
			// 호스트 이름을 문자열로 반환
			System.out.println("getHostName() ==> " + ip.getHostName());
			// IP주소를 반환
			System.out.println("getHostAddress() ==> " + ip.getHostAddress());
			System.out.println("toString() ==> " + ip.toString());
			
			// InetAddress 객체의 IP주소를 반환
			byte[] ipAddr = ip.getAddress();
			System.out.println("getAddress() ==> " + Arrays.toString(ipAddr));
			
			String result = "";
			for(int i = 0; i < ipAddr.length; i++ ) {
				result += (ipAddr[i] < 0) ? ipAddr[i] + 256 : ipAddr[i];
				result += ".";
			}
			System.out.println("getAddress + 256 ==> " + result );
			System.out.println();
		} catch (UnknownHostException e) {
			e.printStackTrace();
		}

		try {
			ip = InetAddress.getLocalHost();
			System.out.println("getHostName() ==> " + ip.getHostName());
			System.out.println("getHostAddress() ==> " + ip.getHostAddress());
			System.out.println();
		} catch (UnknownHostException e) {
			e.printStackTrace();
		}
		
		try {
			ipArr = InetAddress.getAllByName("www.google.com");
			
			for(int i = 0; i < ipArr.length ; i ++) {
				System.out.println("ipArr[" + i + "] ==> " + ipArr[i]);
			}			
		} catch (UnknownHostException e) {
			e.printStackTrace();
		}
	}
}



결과
getHostName() ==> www.naver.com
getHostAddress() ==> 23.53.225.247
toString() ==> www.naver.com/23.53.225.247
getAddress() ==> [23, 53, -31, -9]
getAddress + 256 ==> 23.53.225.247.

getHostName() ==> DESKTOP-JQMB1LP
getHostAddress() ==> 192.168.4.190

ipArr[0] ==> www.google.com/142.250.204.68

 

위의 getAddress()의 결과값이 음수로 나오는 이유는

InetAddress 객체의 실제 IP 주소를 byte 형의 배열로 변환하는데

byte의 범위는 -128~127이기 때문에 127을 넘으면 음수가 된다.

따라서 256을 더해줘서 0~255 사이의  값을 가지도록 바꿔준다.

 

 

 

 

 


 

 

 

 

 

URL 클래스 - 특정 URL에서 각종 정보 가져오기

 

 

 

  • URL을 추상화 하여 만든 클래스.
  • final 클래스로 되어 있기 때문에 상속하여 사용 불가.
  • 모든 생성자는 MalformedURLException 예외를 발생하기 때문에 반드시 예외처리를 해야 함.

 

 

 

 

 

URL 클래스의 주요 메소드를 사용한 예를 보며 이해해보자.

 

package Network;

import java.net.*;
import java.util.*;


public class Lecture {

	public static void main(String[] args) throws Exception {
		
		URL url = new URL("https://0rcticfox.tistory.com/entry/%EB%AF%B8%EC%99%84824-%EC%9E%90%EB%B0%94Java-%EC%98%88%EC%99%B8%EC%B2%98%EB%A6%AC-%EC%8A%A4%EB%A0%88%EB%93%9CThread?category=975976");
		
        // URL의 호스트명과 포트를 결합한 문자열을 반환한다.
		System.out.println("url.getAuthority() : "		+ url.getAuthority());
        // Content 값을 반환한다(?)
		System.out.println("url.getContent() : "		+ url.getContent());
        // URL에 상관없이 프로토콜의 default 포트 번호를 반환한다.
		System.out.println("url.getDefaultPort() : "		+ url.getDefaultPort());
        // URL에 명시된 포트를 반환한다. 명시되지 않았다면 -1을 반환한다.
		System.out.println("url.getPort() : "			+ url.getPort());
        // URL의 Path와 query를 결합한 문자열을 반환한다.
		System.out.println("url.getFile() : "			+ url.getFile());
		
        // URL의 Host를 문자열로 반환한다.
		System.out.println("url.getHost() : "			+ url.getHost());
        // URL의 경로를 문자열로 반환한다.
		System.out.println("url.getPath() : "			+ url.getPath());
        // URL의 Protocol을 문자열로 반환한다.
		System.out.println("url.getProtocol() : "		+ url.getProtocol());
        // URL의 query를 문자열로 반환한다.
		System.out.println("url.getQuery() : "			+ url.getQuery());
        // URL의 reference를 문자열로 반환한다.
		System.out.println("url.getRef() : "			+ url.getRef());
		
        // URL의 사용자 정보 부분을 반환한다. 없으면 null.
		System.out.println("url.getUserInfo() : "		+ url.getUserInfo());
        // URL을 문자열로 반환한다.
		System.out.println("url.toExternalForm() : "		+ url.toExternalForm());
        // 못 찾음....
		System.out.println("url.toURI() : "			+ url.toURI());
	}
}



결과
url.getAuthority() : 0rcticfox.tistory.com
url.getContent() : sun.net.www.protocol.http.HttpURLConnection$HttpInputStream@78e94dcf
url.getDefaultPort() : 443
url.getPort() : -1
url.getFile() : /entry/%EB%AF%B8%EC%99%84824-%EC%9E%90%EB%B0%94Java-%EC%98%88%EC%99%B8%EC%B2%98%EB%A6%AC-%EC%8A%A4%EB%A0%88%EB%93%9CThread?category=975976
url.getHost() : 0rcticfox.tistory.com
url.getPath() : /entry/%EB%AF%B8%EC%99%84824-%EC%9E%90%EB%B0%94Java-%EC%98%88%EC%99%B8%EC%B2%98%EB%A6%AC-%EC%8A%A4%EB%A0%88%EB%93%9CThread
url.getProtocol() : https
url.getQuery() : category=975976
url.getRef() : null
url.getUserInfo() : null
url.toExternalForm() : https://0rcticfox.tistory.com/entry/%EB%AF%B8%EC%99%84824-%EC%9E%90%EB%B0%94Java-%EC%98%88%EC%99%B8%EC%B2%98%EB%A6%AC-%EC%8A%A4%EB%A0%88%EB%93%9CThread?category=975976
url.toURI() : https://0rcticfox.tistory.com/entry/%EB%AF%B8%EC%99%84824-%EC%9E%90%EB%B0%94Java-%EC%98%88%EC%99%B8%EC%B2%98%EB%A6%AC-%EC%8A%A4%EB%A0%88%EB%93%9CThread?category=975976

 

 

 

 

 


 

 

 

 

 

URL 클래스 - 페이지 html 소스 가져오기

 

 

 

자바로 html 페이지 소스를 가져와 보자.

 

package Network;

import java.net.*;
import java.io.*;

public class Lecture {

	public static void main(String[] args) throws Exception {
		
		URL url = null;
		BufferedReader input	= null;
		
        // 원하는 url을 address에 넣는다.
		String address = "https://0rcticfox.tistory.com/entry/822-%EC%9E%90%EB%B0%94Java-GUI-%ED%99%9C%EC%9A%A9-JPanel-%ED%99%9C%EC%9A%A9-%EA%B3%84%EC%82%B0%EA%B8%B0-%EC%98%A4%EB%AA%A9-%EA%B2%8C%EC%9E%84?category=975976";
		String line = "";
		
		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();
		}
	}
}

 

결과는 너무 기니까 생략한다.

 

 

 

 

 


 

 

 

 

 

URL 클래스 - 페이지 html 소스를 파일로 만들기

 

 

 

package Network;

import java.net.*;
import java.io.*;

public class Lecture {

	public static void main(String[] args) throws Exception {
		
		URL url = null;
		InputStream in	= null;
		FileOutputStream out = null;
		
		// 원하는 url을 적는다.
		String address = "https://0rcticfox.tistory.com/entry/819-%EC%9E%90%EB%B0%94Java-GUI-%ED%99%9C%EC%9A%A9-818-%EB%B9%99%EA%B3%A0-%EB%A7%8C%EB%93%A4%EA%B8%B0-%EC%9D%B4%EC%96%B4%EC%84%9C?category=975976";
		int ch = 0;
		
		try {
			url = new URL(address);
			in = url.openStream();
			// 원하는 위치에 원하는 이름과 파일형식으로 적는다.
			out = new FileOutputStream("C:\\Lee\\spring-tool-suite-3.9.18.RELEASE-e4.21.0-win32-x86_64\\sts-bundle\\workspace\\AWSclass\\src\\즐겜페이지.txt");
			
			while((ch = in.read()) != -1) {
				out.write(ch);
			}
			in.close();
			out.close();
			
		} catch(Exception e){
			e.printStackTrace();
		}
	}
}

 

 

 

 

 

 

 


 

 

 

 

 

Socket programming

 

 

 

Socket

- 네트워크에서 실행되는 프로그램 간의 통신을 할 수 있게하는 도킹 공간이다.

- 도킹 공간는 IP 주소와 포트 번호 조합임.

- 프로그램 양쪽 모두에 소켓은 필요하다.

- Java에서는 java.net 패키지를 통해서 Socket 프로그래밍을 지원한다. (import java.net.Socket)

- 소켓 통신에 사용되는 프로토콜에 따라 다른 종류의 소켓을 구현하여 제공한다.

- InputStream과 OutputStream을 가지고 있다.

 

 

 

ServerSocket

- 포트와 연결되어 외부의 연결 요청을 기다리고 있다가 연결 요청이 들어 오면

   Socket을 생성해서 소켓과 소켓간의 통신이 이루어지도록 한다.

- 하나의 Port에 하나의 ServerSocket만 연결할 수 있다.

- Java에서는 java.net 패키지를 통해서 Socket 프로그래밍을 지원한다. (import java.net.ServerSocket)

 

 

 

Socket programming

네트워크를 통해 두 컴퓨터 간에 데이터를 통신하는 수단을 말한다.

일반적으로 TCP(통신 제어 프로토콜)과 UDP(사용자 데이터그램 프로토콜)의 2가지 방식으로 제공된다.

 

 

 

 

 


 

 

 

 

 

TCP/UDP

 

 

 

항목 TCP  UDP 
연결방식  연결기반
연결 후 통신(전화기) - 1:1 통신방식
비연결기반(connectionless-oriented)
연결없이 통신(택배) - 1:1, 1:n, n:n
통신방식 
특징 데이터의 경계를 구분안한다.

신뢰성 있는 데이터 전송한다.

데이터의 전송순서가 보장된다.

데이터의 수신여부를 확인한다
(데이터가 손실되면 재전송된다.)

패킷을 관리할 필요가 없다.

UDP보다 전송속도가 느리다.

 클라이언트가 서버에 연결하고
두 시스템이 통신할 수 있게 하는
비교적 간단하고 안정적인 시나리오에 적합

데이터의 경계를 구분한다.

신뢰성 없는 데이터를 전송한다.

데이터의 전송순서가 변동될 수 있다.

데이터의 수신여부를 확인 안 한다
(데이터가 손실되어도 알 수 없다.)

패킷을 관리해주어야 한다.

TCP보다 전송속도가 빠르다.


미디어 스트리밍과 같이 모든 패킷이
대상에 도착할 필요가 없는 시나리오에 적합
관련 클래스 Socket
ServerSocket
DatagramSocket
Datagrampacket
MulticastSocke

 

 

 

 

 

 


 

 

 

 

 

채팅 프로그램 만들기

 

8/26 참고

 

 

 

728x90
반응형

댓글