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 참고
'코딩수업 > AWS 클라우드환경 네이티브' 카테고리의 다른 글
8/29 데이터베이스(DB) MySQL 다운 및 설치, workbench / cmd 설정, 전반적인 기초 (0) | 2022.08.29 |
---|---|
(미완) 8/26 자바(Java) 자바 입력의 전체적 개요, 채팅 프로그램 만들기 (0) | 2022.08.26 |
8/24 자바(Java) 예외처리(Exception), 스레드(Thread), ArrayList (0) | 2022.08.25 |
8/23 자바(Java) GUI 활용 - 오목 게임 만들기 이어서 (4) | 2022.08.24 |
8/22 자바(Java) GUI 활용 - JPanel 활용, 계산기, 오목 게임 (0) | 2022.08.22 |
댓글