17일차 네트워크 기초
apache log4j2 >> apache-log4j-2.17.2-bin.zip >>HTTP 다운로드
*jar는 패키지와 클래스들의 집합체
- Log4j는 여러 자바 로깅 프레임워크들 가운데 하나이다. 최종 사용자가 제품의 문제나 정보를 식별하기 위해, 그리고 소프트웨어 개발자가 프로그램을 개발하는 도중에 디버깅 등을 위해 타임스탬프 등 정해진 양식에 맞추어 화면 상이나 파일로 로그를 남길 목적으로 사용된다.
------------------------------------Log4j.xml--------------------------------------------
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
<Appenders>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="%d{HH:mm:ss.SSS} %5p --- [%-15.40t] %-1.50c{1.}.(%-M:%-L) │ %m%n%ex"/>
</Console>
</Appenders>
<Loggers>
<Root level="trace">
<AppenderRef ref="Console"/>
</Root>
</Loggers>
</Configuration>
롬복이 사용하는 jar 는 api core 로 시작되는 것만 사용
api => Application Programming Interface
core = > api의 구현체
--------------------------------------주소에 관하여 ----------------------------------------
package inetex01;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.Arrays;
import lombok.extern.log4j.Log4j2;
@Log4j2
public class InetEx {
public static void main(String[] args) throws UnknownHostException {
// log.fatal("fatal");
// log.error("error");
// log.warn("warn");
// log.info("info");
// log.debug("debug");
// log.trace("trace"); 위로갈수록 심각
// xml파일에서 log를 어떤수준 레벨부터 쓸 것인지 정의 되어있음
// log를 어떻게 쓸지는 용량 등에 따라 판단
log.debug("main({}) invoked.", Arrays.toString(args));
//----------------------------------------첫번째 용법---------------------------------
// InetAddress localhost = InetAddress.getLocalHost();
// InetAddress IP 주소를 표현할때 사용하는 클래스 -getLocalHost 나의주소를 얻어주는 메서드
// log.info("0. localhost : {}, type: {}", localhost, localhost.getClass().getName());
// 결과 18:02:24.131(시간) DEBUG(로그레벨) --- [main ](로그를 남긴 쓰레드 이름) i.InetEx.(클래스의 완전한 이름) (main:24)(로그를 남긴 클래스의 메서드 이름과 남긴 행) │ main([]) invoked.(어떤 로그를 남겼는지)
// 결과 18:02:24.133 INFO --- [main ] i.InetEx.(main:28) │ 0. localhost : DESKTOP-V17RG1U/1.1.1.1(임의), type: java.net.Inet4Address
//--------------------------------------- 두번째 용법----------------------------------------
//InetAddress 객체로부터 얻을 수 있는 부가정보가 아주많음을 보여주는 예제코드
//Domain name -> IP 주소로 변한 using DNS service
// InetAddress addr = InetAddress.getByName("www.naver.com");
//
// log.info("1. addr: {}", addr);
// log.info("2. hostname: {}", addr.getHostName());
// log.info("3. FQDN: {}", addr.getCanonicalHostName());
// log.info("4. hostAddress: {}", addr.getHostAddress());
// log.info("5. loopback: {}", InetAddress.getLoopbackAddress());
// log.info("6. localhost: {}", InetAddress.getLocalHost());
// 19:05:53.647 INFO --- [main ] i.InetEx.(main:47) │ 1. addr: www.naver.com/223.130.195.95 ->모든 주소를 알려준다.
// 19:05:53.647 INFO --- [main ] i.InetEx.(main:48) │ 2. hostname: www.naver.com ->도메인네임
// 19:05:53.659 INFO --- [main ] i.InetEx.(main:49) │ 3. FQDN: 223.130.195.95 ->완전한 도메인주소
// 19:05:53.660 INFO --- [main ] i.InetEx.(main:50) │ 4. hostAddress: 223.130.195.95 ->
// 19:05:53.665 INFO --- [main ] i.InetEx.(main:51) │ 5. loopback: localhost/127.0.0.1 ->자기자신을 의미하는 주소
// 19:05:53.665 INFO --- [main ] i.InetEx.(main:52) │ 6. localhost: DESKTOP-V17RG1U/1.1.1.1(임의) ->내 컴퓨터이름과 주소
// -----------------------------------------세번째 용법 ----------------------------
// // 주어진 도메인명이 DNS에 등록된 모든 IP주소를 가져와서 주소를 구성하는 각 정수를 출력하는 예제
// InetAddress addr = InetAddress.getByName("www.naver.com");
//
// byte[] addrBytes =addr.getAddress();//4개의 숫자와 3개의 도트로 구분된 값을 byte배열로 준다
// log.info("7. byteAddr:{}" , Arrays.toString(addrBytes));
//
// // Get normal Host Address when one byte <0 , the byte +256 required
// for(byte b : addrBytes) {
// log.info("\t + b:{}", (b < 0? b+256 : b)); //음수값이 나오는 아이피에 대한 바이트의 보정
//
// }// enhanced for
// -----------------------------------------네번째 용법 ----------------------------
InetAddress[] addrs = InetAddress.getAllByName("www.naver.com");
for(InetAddress address : addrs) {
log.info("8. address: {}",address);
log.info("9. FQDN: {}",address.getCanonicalHostName());
}// enhanced for
}//main
}// class
---------------------------------------URL과 URI --------------------------------------------
package inetex01;
import java.io.IOException;
import java.net.URL;
import lombok.extern.log4j.Log4j2;
import java.net.URISyntaxException;
@Log4j2
public class Urlex {
//URL : Uniform Resource Locator (단일화 된 방법으로 웹상의 자원의 위치를 알려주는 자)(주소전체)
//URI : Uniform Resource Indicator (단일화 된 방법으로 웹상의 자원을 가리키는 지시자 )(도메인주소와 포트번호 제외한 나머지)
public static void main(String[] args) throws IOException, URISyntaxException {
log.debug("main() invoked");
// ---------------------- 첫번째
// URL url1 = new URL("https://www.google.com/images/branding/googlelogo/2x/googlelogo_color_272x92dp.png");
// log.info("1. url1: {}, type: {}", url1 , url1.getClass().getName());
// https - 통신규약(웹에서는 2개로 정해져 있음: http / https) <--암호화(+비용)---http: HyperText Transfer protocol Secure
// :// -- 다음에 이렇게 기호가 나와야한다고 표준으로 정함
// www.google.com --IP주소 / 도메인명 기재하라!
// :<Port> --서버 프로그램의 포트번호를 기재하라!
// (1)통신규약이 http라면 기본포트는 80이고 (생략가능)
// (2)통신규약이 https 라면 기본포트 443이다.(생략가능)
// /images/branding/googlelogo/2x/googlelogo_color_272x92dp.png <-(URI)
// ---------------------- 두번째
// URL url2 = new URL("https",
// "www.google.com",
// "/images/branding/googlelogo/2x/googlelogo_color_272x92dp.png");
// // 단위별로 구분지어도 잘 출력된다.
// log.info("2. url2: {}, type: {}", url2 , url2.getClass().getName());
//
// ---------------------- 세번째
// URL url3 = new URL("https",
// "www.google.com",
// "/images/branding/googlelogo/2x/googlelogo_color_272x92dp.png");
//
// log.info("3. url3: {}", url3 );
//
// ---------------------- 네번째
URL png = new URL("https://www.google.com/images/branding/googlelogo/2x/googlelogo_color_272x92dp.png");
log.info("4. png: {}", png );
log.info("\t+ getAuthority: {}", png.getAuthority() ); //결과 www.google.com
log.info("\t+ getProtocol: {}", png.getProtocol() ); //결과 https
log.info("\t+ getHost: {}", png.getHost() ); //결과 www.google.com
log.info("\t+ getPort: {}", png.getPort() ); // 결과 -1
log.info("\t+ getDefaultPort: {}", png.getDefaultPort() ); //결과 443
log.info("\t+ getgetFile(): {}", png.getFile() ); // 결과 /images/branding/googlelogo/2x/googlelogo_color_272x92dp.png
log.info("\t+ getPath: {}", png.getPath() ); // 결과 /images/branding/googlelogo/2x/googlelogo_color_272x92dp.png
log.info("\t+ png.getQuery: {}", png.getQuery() ); //결과 null
log.info("\t+ getRef: {}", png.getRef() ); //결과 null
log.info("\t+ getUserInfo: {}", png.getUserInfo() ); //결과 null
log.info("\t+ getContent: {}", png.getContent() ); // 이게 제일 중요함 //결과 sun.awt.image.URLImageSource@38234a38
log.info("\t+ toExternalForm: {}", png.toExternalForm() ); //결과 https://www.google.com/images/branding/googlelogo/2x/googlelogo_color_272x92dp.png
log.info("\t+ toURI: {}", png.toURI() ); //결과 https://www.google.com/images/branding/googlelogo/2x/googlelogo_color_272x92dp.png
}//main
}// end class
----------------------------------URLConnection의 메소드 --------------------------------
package inetex01;
import java.io.IOException;
import java.net.URL;
import java.net.URLConnection;
import java.util.Arrays;
import java.util.Date;
import lombok.extern.log4j.Log4j2;
@Log4j2
public class Url_Connection {
public static void main(String[] args) throws IOException {
log.debug("main({}) invoked.", Arrays.toString(args));
String url = "https://www.google.com/images/branding/googlelogo/2x/googlelogo_color_272x92dp.png";
URL png = new URL(url);
URLConnection urlConn = png.openConnection(); //실제 브라우저처럼 접속을 시도
log.info(" 1. url : {}", url);
log.info(" 2. urlConn : {}", urlConn);
log.info(" 3. getAllowUserInteraction : {}", urlConn.getAllowUserInteraction());
log.info(" 4. getDefaultAllowUserInteraction : {}", URLConnection.getDefaultAllowUserInteraction());
log.info(" 5. getConnectTimeout : {}", urlConn.getConnectTimeout());
log.info(" 6. getContent : {}", urlConn.getContent());
log.info(" 7. getContentEncoding : {}", urlConn.getContentEncoding());
log.info(" 8. getContentLength : {}", urlConn.getContentLength());
log.info(" 9. getContentType : {}", urlConn.getContentType());
log.info("10. getDate : {}", new Date(urlConn.getDate()));
log.info("11. getDefaultUseCaches : {}", urlConn.getDefaultUseCaches());
log.info("12. getDoInput : {}", urlConn.getDoInput());
log.info("13. getDoOutput : {}", urlConn.getDoOutput());
log.info("14. getExpiration : {}", urlConn.getExpiration());
log.info("15. getHeaderFields : {}", urlConn.getHeaderFields());
log.info("16. getIfModifiedSince : {}", urlConn.getIfModifiedSince());
log.info("17. getLastModified : {}", new Date(urlConn.getLastModified()));
log.info("18. getReadTimeout : {}", urlConn.getReadTimeout());
log.info("19. getURL : {}", urlConn.getURL());
log.info("20. getUseCaches : {}", urlConn.getUseCaches());
//1. url : https://www.google.com/images/branding/googlelogo/2x/googlelogo_color_272x92dp.png
//2. urlConn : sun.net.www.protocol.https.DelegateHttpsURLConnection:https://www.google.com/images/branding/googlelogo/2x/googlelogo_color_272x92dp.png
//3. getAllowUserInteraction : false
//4. getDefaultAllowUserInteraction : false
//5. getConnectTimeout : 0
//6. getContent : sun.awt.image.URLImageSource@484094a5
//7. getContentEncoding : null
//8. getContentLength : 13504
//9. getContentType : image/png
//10. getDate : 2022-04-15T14:59:15.000+0900
//11. getDefaultUseCaches : true
//12. getDoInput : true
//13. getDoOutput : false
//14. getExpiration : 1650002355000
//15. getHeaderFields : {null=[HTTP/1.1 200 OK], Alt-Svc=[h3=":443"; ma=2592000,h3-29=":443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43"], Server=[sffe], X-Content-Type-Options=[nosniff], Last-Modified=[Tue, 22 Oct 2019 18:30:00 GMT], Date=[Fri, 15 Apr 2022 05:59:15 GMT], Accept-Ranges=[bytes], Cache-Control=[private, max-age=31536000], Report-To=[{"group":"static-on-bigtable","max_age":2592000,"endpoints":[{"url":"https://csp.withgoogle.com/csp/report-to/static-on-bigtable"}]}], Cross-Origin-Opener-Policy-Report-Only=[same-origin; report-to="static-on-bigtable"], Expires=[Fri, 15 Apr 2022 05:59:15 GMT], Cross-Origin-Resource-Policy=[cross-origin], X-XSS-Protection=[0], Content-Length=[13504], Content-Type=[image/png]}
//16. getIfModifiedSince : 0
//17. getLastModified : 2019-10-23T03:30:00.000+0900
//18. getReadTimeout : 0
//19. getURL : https://www.google.com/images/branding/googlelogo/2x/googlelogo_color_272x92dp.png
//20. getUseCaches : true ```
---------------------------------URL을 통해 웹서버 코드 읽기 ---------------------------------
package inetex01;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.URL;
import java.net.URLConnection;
import java.util.Arrays;
import lombok.extern.log4j.Log4j2;
@Log4j2
public class ReadUrl {
public static void main(String[] args) throws IOException {
log.debug("main({}) invoked.", Arrays.toString(args));
String url = "https://www.kita.net/cmmrcInfo/cmmrcNews/goodMornKita/goodMornKitaDetail.do";
URL kita =new URL(url);
URLConnection urlConn = kita.openConnection();
InputStream is = urlConn.getInputStream();
// -------------------------------------
// InputSteam is = kita.openStream();
// ---------------------------------
// 응답내용 꺼내오기
BufferedReader br = new BufferedReader(new InputStreamReader(is));
try(is ; br){
String line;
while((line = br.readLine())!= null) {
log.info(line);
}//while
} //try-with-resources
}//main
}// end class
TCP 네트워킹
TCP/IP Networking
TCP:전송제어 통신규약 <---반대---> UDP(User -Datagram Packet):편지봉투
-ip규약으로 된 연결위에서 이뤄짐
-연결 지향적 프로토콜 -> 시간 소요
-통신 선로 고정 -> 전송 속도 느려질 수 있음
-데이터를 정확하고 안정적으로 전달
IP : Internet Protocol (인터넷 통신규약)
- ip주소와 port 번호로 연결을 생성한다.
1. 클라이언트의 소켓이 ip주소와 port를 이용하여 ServerSocket에게 요청을 보낸다.
2. ServerSocket이 서버 내부에 Socket을 만든다.
3. 서버에서 생성된 Socket은 클라이언트 Socket에 통신하며 입출력이 이뤄진다
(1)ServerSocket 생성과 리슨포트 바인딩
-생성자에 바인딩 포트 대입하고 객체 생성
-------------------------------서버소켓 사용 방법 ---------------------------------
package inetex01;
import java.io.IOException;
import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.net.ServerSocket;
import java.util.Arrays;
import lombok.extern.log4j.Log4j2;
@Log4j2
public class ServerSocketEx {
public static void main(String[] args) throws IOException {
log.debug("main({}) invoked.", Arrays.toString(args));
int listenPort =7777;
int backLog = 100;
// -------------------------------------------서버 소켓 생성하는 첫번째 방법
// 포트를 직접 물고오는 메소드 사용
// ServerSocket serverSocket = new ServerSocket();
// serverSocket.bind(new InetSocketAddress(listenPort)); // 지정된 Listen 포트를 바인딩
// IP ANY = 0.0.0.0 어떤 IP로 와도되지만 port가 맞아야 들어올 수 있음
//
// serverSocket.bind(new InetSocketAddress(InetAddress.getLocalHost(), listenPort));
// serverSocket.bind(new InetSocketAddress(InetAddress.getLocalHost(), listenPort), backLog);
// //많은 클라이언트가 동시에 접속을 수행하면 대기를 시키고 대기시키는 곳의 크기를 backLog라고 한다.
// backLog 가용 안에서만 처리가 가능하고 그 외는 무한대기 또는 오류가 발생한다
// serverSocket.bind(new InetSocketAddress("0.0.0.0", listenPort), backLog);
// 서버가 운영하는 모든 ip주소에 대해서 port만 맞으면 수락
// -------------------------------------------생성자를 통해 바로 생성 두번째 방법
// 명시적이지 않음
// ServerSocket serverSocket = new ServerSocket(listenPort);
// ---------------------------------------------
// ServerSocket serverSocket = new ServerSocket(listenPort,backLog); //백로그는 정보표시안됌
// ---------------------------------------------
ServerSocket serverSocket = new ServerSocket(listenPort,backLog,InetAddress.getLocalHost());
log.info("1.serverSoket : {}",serverSocket);
}
}
(2)연결 수락
-accept() 메소드는 클라이언트가 연결 요청 전까지 블로킹 -> 대기
-연결된 클라이언트 IP 주소 얻기
InetSocketAddress -이 클래스는 IP 소켓 주소 (IP 주소(컴퓨터이름/ip) + 포트 번호!!)를 구현
Author And Source
이 문제에 관하여(17일차 네트워크 기초), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@koo9b9h/16일차-네트워크-기초저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)