17日目ネットワークインフラストラクチャ


apache log4j2 >> apache-log4j-2.17.2-bin.zip>>HTTPのダウンロード
*jarはパッケージとクラスの集合です
  • Log 4 jは、複数のjava記録フレームワークの1つである.エンドユーザは,製品の問題や情報を識別するため,ソフトウェア開発者がプログラムの開発中にデバッグなどのためにタイムスタンプなどの所定のフォーマットで画面やファイルにログを残す.
  • ------------------------------------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):封筒
    -ipプロトコルの接続上に確立
    -接続向けプロトコル->時間がかかる
    -固定通信回線->伝送速度が遅くなる場合があります
    -データの正確かつ確実な転送
    IP:インターネットプロトコル
    -ipアドレスとポート番号を使用して接続を作成します.

    1.クライアントのソケットは、IPアドレスとポートを使用してサーバソケットに要求を送信します。


    2.サーバ内部にサーバソケットを作成します。


    3.サーバが生成したsocketはクライアントsocketと通信し、I/Oを実現する


    (1)サーバソケットの作成とレポートポートのバインド


    -作成者にバインドポートを挿入し、オブジェクトを作成します.
    -------------------------------서버소켓 사용 방법 ---------------------------------
     
    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)接続を受け入れる


    -caccept()メソッドは、クライアントが接続を要求する前にブロックされます->待機します.
    -接続されたクライアントIPアドレスの取得
    InetSocketAddress-IPソケットアドレス(IPアドレス(コンピュータ名/ip)+ポート番号!)インプリメンテーション