티스토리 뷰

1.    InetAddress 클래스로 IP 주소 얻기 ( p. 1055 )

-      Java.net.InetAddress 패키지에 들어가 있으며, IP 주소를 표현한 클래스이다.

-      로컬 컴퓨터의 IP주소를 가지고 오며, 도메인 이름을 DNS에서 검색하여 IP 주소를 가지고 오는 기능을 제공한다.

 

2.    네트워크 복습

-      Nc -L -p 8080(포트번호) / telnet IP주소 port번호로 클라이언트와 서버를 연결할 수 있다.

-      Ipconfig /all를 통해서 해당 컴퓨터의 IP주소를 출력할 수 있다.

-      DNS 주소는 nslookup을 통해 해당 사이트의 링크(www.naver.com)을 작성하면 해당 사이트의 주소를 알아볼 수 있다.

-      0.0.0.0이라는 IP주소는 ANY를 의미하며, 어느 IP주소에서도 listen할 준비가 되어있다는 의미이다.

-      127.0.0.1localhostIP주소이다.

-      Ping + IP주소를 통해서 해당 IP주소에 연결할 수 있는지 확인해 준다.

 

3.    TCP ( Transmission Control Protocol ) 네트워킹

-      우리가 일상에서 보통 말하는 인터넷은 네트워크 용어로 “ TCP/IP 네트워크 라고 부른다.

-      이때 TCPIP는 통신규약(protocol)을 의미한다.

-      특징 :

-      TCP는 연결 지향적 프로토콜이기에, 연결통로를 먼저 형성하게 되는데 이로 인해서 시간이 소요된다.

-      데이터를 정확하고 안정적으로 전달하며, 통신 선로를 고정하기에 전송 속도가 느려질 수 있다.

-      ServerSocketSocket 용도 :

-      ServerSocket은 클라이언트의 Socket에서 연결요청이 오기를 특정 포트번호로 기다리고 있으며, 클라이언트의 Socket에서 연결요청이 오면 이를 수락하여 서버의 Soket을 생성한다. 이를 통해서 클라이언트의 Socket과 서버의 Socket 사이의 통로가 형성되어 통신하게 된다.

-      Old I / O 기반으로 네트워킹 프로그래밍 : java.net

-       + (1) ServerSocket(for server) / Socket(for server)(2)Socket(for client)이라는 클래스와 (3)InputStream/OutputStream/Reader/Writer/모든 보조스트림이 필요하다.

-       + 추가적으로 (4)InetAddress(IP주소 + 호스트명) / InetSocketAddress(IntAddress + Port 번호)를 사용하기도 한다.

-      New I / O 기반으로 <Ditto.> : java.nio

 


더보기

01. InetAddress

package inet_adress_practice;

import java.net.InetAddress;
import java.net.UnknownHostException;

public class InetAdressExample {

	public static void main (String[] args ) { // InetAddress 클래스 (****)
		
		try {
			
			// InetAddress 클래스의 정적 메소드인 .getLocalHost() 메소드를 (****)
			// 호출하여, 내 PC의 IP주소를 가지고 있는 InetAddress 객체를 얻어낸다.
			// InetAddress 클래스의 경우, new를 통해서 객체를 생성하지 않는다!!!
			
			InetAddress local = InetAddress.getLocalHost();
			
			System.out.println(local);
			// 출력 : LAPTOP-O7HNQF0G/172.30.1.13 ( 내 컴퓨터의 이름과 IP주소를 가지고 있다. )
			
			System.out.println("내 컴퓨터 주소 : " + local.getHostAddress());
			// 출력 : 내 컴퓨터 주소 : 172.30.1.13 ( IP주소가 출력된다. )
			
//			===========================================================================
			
			// DNS 서버에 질의한 도메인명( 아래, www.naver.com )에 매핑되어 있는
			// 모든 IP주소를 달라!!라고 요청  (**)
			
			InetAddress [] iaArr = InetAddress.getAllByName("www.naver.com");
			
			for ( InetAddress remote : iaArr ) {
				System.out.println("www.naver.com IP주소 : " + remote.getHostAddress());
				
				System.out.println();
				
				System.out.println("그냥 remote : " + remote);
				
				System.out.println();
			} // enhance for
			
			// www.을 제외하고 실행할 경우에는 더 많은 IP주소가 나올 수 있다.
			
//			===========================================================================
			
			// 출력 :
//			www.naver.com IP주소 : 223.130.200.107
//
//			그냥 remote : www.naver.com/223.130.200.107
//
//			www.naver.com IP주소 : 223.130.195.200
//
//			그냥 remote : www.naver.com/223.130.195.200
			
//			===========================================================================
			
		} catch ( UnknownHostException e) {
			e.printStackTrace();
		} // try - catch
		
	} // main
	
} // end class

더보기

02. @Log4j2

package tcp_practice;

import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.Arrays;

import lombok.extern.log4j.Log4j2;


@Log4j2 // 로그를 남길 수 있는 롬복(***)
public class S01_InetAddress { // Log4j2 사용방법 (*****)
	
	public static void main (String [] args) throws UnknownHostException {
		
//		=================================================================================
		
		log.debug("main({}) invoked.", Arrays.toString(args));
		
		// printf와 같이 포멧팅해주는 것으로, { }가 포멧팅 기호이다.
		
		// 출력 :
//		11:44:50.138 DEBUG --- [main           ] t.S01_InetAddress.main - main([]) invoked.
		
		// 여기서 main은 로그를 남긴 스레드의 이름을 표시한 것이며, t.은 패키지 이름을 요약한 이름이다.
		// S01_InetAddress는 클래스의 심플 네임이다.
		// DEBUG 와 INFO는 LOG의 레벨을 나타내는 것이다.
		
//		=================================================================================
		
		InetAddress localhost = InetAddress.getLocalHost();
		
		log.info("0. localhost : {}, type : {}", localhost, localhost.getClass().getName());
		// localhost.getClass().getName() 이거는 clazz 객체의 이름을 반환하라는 의미이다.
		
		// 포멧팅할 객체가 2개이니 {}도 2개를 사용하여 포멧팅해 준다.
		
		// 출력 :
//		11:44:50.141  INFO --- [main           ] t.S01_InetAddress.main - 0. localhost : LAPTOP-O7HNQF0G/172.30.1.13, type : java.net.Inet4Address
		
		// type : java.net.Inet4Address는 실제로 생성된 객체의 진짜 타입을 출력해 준다.
		
//		=================================================================================
		
		// 지정된 도메인명에 대한 IP주소가 여러개 있을지라도, 단 1개의 처음 IP주소만을 얻어내는 정적 메소드 호출
		
		InetAddress addr = InetAddress.getByName("www.naver.com");
		
		log.info("1. addr : {}", addr); 												// 1. 도메인 + IP주소
		log.info("2. hostname : {} ", addr.getHostName());								// 2. 간단한 도메인 명
		log.info("3. FQDN : {}", addr.getCanonicalHostName());							// 3. 완전한 도메인 명 ( FQDN은 네트워크에 따라서 달라진다. )
		log.info("4. HostAdress : {}", addr.getHostAddress());							// 4. IP 주소를 가져 온다.
		log.info("5. loopback : {}", InetAddress.getLoopbackAddress());					// 5. LoopbackAddress는 127.0.0.1을 의미한다.
		log.info("6. localhost : {}", InetAddress.getLocalHost()); 						// 6. 내 컴퓨터의 이름과 IP주소를 가져 온다.
		
//		=================================================================================
		
		// 출력 :
		
//		12:05:16.539  INFO --- [main           ] t.S01_InetAddress.main - 1. addr : www.naver.com/223.130.200.107
//		12:05:16.539  INFO --- [main           ] t.S01_InetAddress.main - 2. hostname : www.naver.com 
//		12:05:21.063  INFO --- [main           ] t.S01_InetAddress.main - 3. FQDN : 223.130.200.107
//		12:05:21.064  INFO --- [main           ] t.S01_InetAddress.main - 4. HostAdress : 223.130.200.107
//		12:05:21.085  INFO --- [main           ] t.S01_InetAddress.main - 5. loopback : localhost/127.0.0.1
//		12:05:21.085  INFO --- [main           ] t.S01_InetAddress.main - 6. localhost : LAPTOP-O7HNQF0G/172.30.1.13
		
//		=================================================================================
		
		// IP주소를 byte [ ] ( 바이트 배열 )로 변환
		
		byte [] addrBytes = addr.getAddress();
		log.info("7. byteAddr : {}", Arrays.toString(addrBytes));
		
		// 출력 :
//		12:05:21.086  INFO --- [main           ] t.S01_InetAddress.main - 7. byteAddr : [-33, -126, -56, 107]
		
//		=================================================================================
		
		for ( byte b : addrBytes ) {
			log.info("\t + b : {}", (b<0)? b+256 : b ); // b가 0보다 작으면 256을 더해주고, 아니면 그대로 출력해라
		} // enhanced for
		
		// 출력 : ( IP주소를 하나씩 출력하고 있음을 알 수 있다. + IP주소는 원래 바이트로 구성되어 있다. )
		
//		12:05:21.086  INFO --- [main           ] t.S01_InetAddress.main - 	 + b : 223
//		12:05:21.086  INFO --- [main           ] t.S01_InetAddress.main - 	 + b : 130
//		12:05:21.086  INFO --- [main           ] t.S01_InetAddress.main - 	 + b : 200
//		12:05:21.086  INFO --- [main           ] t.S01_InetAddress.main - 	 + b : 107
		
//		=================================================================================
		
		InetAddress[] addrs = InetAddress.getAllByName("www.kakao.com");
		
		for ( InetAddress address : addrs ) {
			
			log.info("8. address : {}", address );
			log.info("9. FQDN : {}", address.getCanonicalHostName() );
			
		} // for enhance
		
//		=================================================================================
		
		// 출력 :
		
//		12:20:28.707  INFO --- [main           ] t.S01_InetAddress.main - 8. address : www.kakao.com/211.249.221.105
//		12:20:33.243  INFO --- [main           ] t.S01_InetAddress.main - 9. FQDN : 211.249.221.105
		
//		=================================================================================
		
	} // main

} // end class

더보기

03. URL

package tcp_practice;

import java.io.IOException;
import java.net.URISyntaxException;
import java.net.URL;

import lombok.extern.log4j.Log4j2;


@Log4j2
public class S02_URL {
	
	public static void main (String[] args) throws IOException, URISyntaxException{ // URL에 대해서 이해하자! (***)
		
		// URL = Uniform Resource Locator : 자원의 위치(주소)를 표기한 방법
		// ex. https://www.kita.net/cmmrcInfo/cmmrcNews/goodMornKita/goodMornKitaDetail.do
		
		// URL = http://< domain명 >:< port > + < URI : /로 시작하는 >로 구성되어 있다.
		
		// URI : 지시자로 자신이 원하는 웹 자원이 무엇인지를 알려준다. 
		// ex. /cmmrcInfo/cmmrcNews/goodMornKita/goodMornKitaDetail.do
		
//		==========================================================================
		
		log.debug("main() invoked.");
		
		// 출력 : 12:28:06.191 DEBUG --- [main           ] t.S02_URL.main - main() invoked.
		
//		==========================================================================
		
		URL url1 = new URL("https://www.kita.net/cmmrcInfo/cmmrcNews/goodMornKita/goodMornKitaDetail.do");
		log.info("1. url1 : {}, type : {}", url1, url1.getClass().getName());
		
		// url1.getClass().getName()는 실제 생성된 객체의 타입을 알려준다. -> java.net.URL 타입임을 알 수 있다.
		
		// 출력 :
//		12:28:06.199  INFO --- [main           ] t.S02_URL.main - 1. url1 : https://www.kita.net/cmmrcInfo/cmmrcNews/goodMornKita/goodMornKitaDetail.do, type : java.net.URL
		
//		==========================================================================
		
		URL url2 = new URL("http","www.kita.net","/cmmrcInfo/cmmrcNews/goodMornKita/goodMornKitaDetail.do");
		log.info("2. url2 : {}", url2);
		
		// 출력 :
//		13:39:45.817  INFO --- [main           ] t.S02_URL.main - 2. url2 : http://www.kita.net/cmmrcInfo/cmmrcNews/goodMornKita/goodMornKitaDetail.do
		
//		==========================================================================
		
		URL url3 = new URL("http","www.kita.net",80,"/cmmrcInfo/cmmrcNews/goodMornKita/goodMornKitaDetail.do");
		log.info("3. url3 : {}", url3);
		
		// 출력 :
//		13:39:45.817  INFO --- [main           ] t.S02_URL.main - 3. url3 : http://www.kita.net:80/cmmrcInfo/cmmrcNews/goodMornKita/goodMornKitaDetail.do
		
		// 나누어서 출력해도 제대로 작동되고 있음을 볼 수 있다.
		
//		==========================================================================
		
		URL kita = new URL("https://www.kita.net/cmmrcInfo/cmmrcNews/goodMornKita/goodMornKitaDetail.do");
		log.info("4. kita : {} ",kita);
		
		// 출력 :
//		13:46:13.879  INFO --- [main           ] t.S02_URL.main - 4. kita : https://www.kita.net/cmmrcInfo/cmmrcNews/goodMornKita/goodMornKitaDetail.do 
		
//		==========================================================================
		
		// 필요한 정보 꺼내기
		
		log.info("\t + getAuthority : {}", kita.getAuthority()); // 도메인 명
		log.info("\t + getProtocol : {}", kita.getProtocol()); // http / https
		log.info("\t + getHost : {}", kita.getHost()); // 도메인 명
		log.info("\t + getPort : {}", kita.getPort()); // 실제로 유효한 값이 없어 -1로 출력 ( 포트 번호가 생략되었기 때문 )
		log.info("\t + getDefaultPort : {}", kita.getDefaultPort()); // https의 경우 디폴트 포트 번호는 443번이다.
		log.info("\t + getFile : {}", kita.getFile()); // URI
		log.info("\t + getPath : {}", kita.getPath()); // URI
		log.info("\t + getQuery : {}", kita.getQuery());
		log.info("\t + getRef : {}", kita.getRef());
		log.info("\t + getUserInfo : {}", kita.getUserInfo());
		log.info("\t + getContent : {}", kita.getContent()); // 주소가 나온다.
		log.info("\t + toExternalForm : {}", kita.toExternalForm()); // URL이 그대로 출력된다.
		log.info("\t + toURI : {}", kita.toURI()); // URI만 나오는 것이 아니라 URL이 나와버린다.
		
//		==========================================================================
		
		// 출력 :
		
//		13:46:13.879  INFO --- [main           ] t.S02_URL.main - 	 + getAuthority : www.kita.net
//		13:46:13.879  INFO --- [main           ] t.S02_URL.main - 	 + getProtocol : https
//		13:46:13.880  INFO --- [main           ] t.S02_URL.main - 	 + getHost : www.kita.net
//		13:46:13.880  INFO --- [main           ] t.S02_URL.main - 	 + getPort : -1
//		13:46:13.880  INFO --- [main           ] t.S02_URL.main - 	 + getDefaultPort : 443
//		13:46:13.880  INFO --- [main           ] t.S02_URL.main - 	 + getFile : /cmmrcInfo/cmmrcNews/goodMornKita/goodMornKitaDetail.do
//		13:46:13.880  INFO --- [main           ] t.S02_URL.main - 	 + getPath : /cmmrcInfo/cmmrcNews/goodMornKita/goodMornKitaDetail.do
//		13:46:13.881  INFO --- [main           ] t.S02_URL.main - 	 + getQuery : null
//		13:46:13.881  INFO --- [main           ] t.S02_URL.main - 	 + getRef : null
//		13:46:13.881  INFO --- [main           ] t.S02_URL.main - 	 + getUserInfo : null
//		13:46:15.477  INFO --- [main           ] t.S02_URL.main - 	 + getContent : sun.net.www.protocol.http.HttpURLConnection$HttpInputStream@7d1cfb8b
//		13:46:15.477  INFO --- [main           ] t.S02_URL.main - 	 + toExternalForm : https://www.kita.net/cmmrcInfo/cmmrcNews/goodMornKita/goodMornKitaDetail.do
//		13:46:15.477  INFO --- [main           ] t.S02_URL.main - 	 + toURI : https://www.kita.net/cmmrcInfo/cmmrcNews/goodMornKita/goodMornKitaDetail.do
		
//		==========================================================================
		
//		==========================================================================
		
		
//		==========================================================================
		
	} // main

} // end class

더보기

04. URLConnection

package tcp_practice;

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 S03_URLConnection {
	
	public static void main (String[] args) throws IOException { // URLConnection (***)
		
		log.debug("main({}) invoked.", Arrays.toString(args));
		
		String url = "https://www.kita.net/cmmrcInfo/cmmrcNews/goodMornKita/goodMornKitaDetail.do";
		
		URL kita = new URL(url);
		
//		=====================================================================================
		
		// 지정된 URL에 직접 연결을 시도하고, 연결(터널)을 생성한 객체 (***)
		URLConnection urlConn = kita.openConnection();
		
//		=====================================================================================
		
		// 이 URLConnection 객체는 생성된 연결을 통해서, 지정된 URL에 있는 웹 자원으로부터 다양한 컨텐츠를 얻어낼 수 있음
		
		log.info(" 1. kita : {}",kita); // URL타입의 kita에 저장되어 있는 사이트 URL이 출력된다. 
		log.info(" 2. urlConn : {}",urlConn); // urlConn 객체를 출력하게 된다.
		
//		=====================================================================================
		
		log.info("\t + type : {}", urlConn.getClass().getName()); // urlConn의 실제 타입을 알아보자!
		
		// 출력 :
//		14:15:05.289  INFO --- [main           ] t.S03_URLConnection.main - 	 + type : sun.net.www.protocol.https.HttpsURLConnectionImpl
		
		// HttpsURLConnectionImpl이라고 적혀 있는 것을 보아 실제로는 HttpsURLConnection타입인 것을 알 수 있다.
		
//		=====================================================================================
		
		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. getContentType : {}",urlConn.getContentType()); // 사이트가 뭐로 만들어졌는지 ( UTF8로 작성, 웹 사이트임 )
		log.info(" 9. getContentLength : {}",urlConn.getContentLength());
		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()); // 얼마나 기다릴지 정해졌는지 판단 ( 0은 무한정으로 기다린다는 의미 )
		log.info(" 19. getURL : {}",urlConn.getURL());
		log.info(" 20. getUseCaches : {}",urlConn.getUseCaches()); // 캐쉬 지금 사용하는지 판단
		
//		=====================================================================================
		
		// 출력 :
		
//		14:43:55.490 DEBUG --- [main           ] t.S03_URLConnection.main - main([]) invoked.
//		14:43:55.761  INFO --- [main           ] t.S03_URLConnection.main -  1. kita : https://www.kita.net/cmmrcInfo/cmmrcNews/goodMornKita/goodMornKitaDetail.do
//		14:43:55.762  INFO --- [main           ] t.S03_URLConnection.main -  2. urlConn : sun.net.www.protocol.https.DelegateHttpsURLConnection:https://www.kita.net/cmmrcInfo/cmmrcNews/goodMornKita/goodMornKitaDetail.do
//		14:43:55.762  INFO --- [main           ] t.S03_URLConnection.main - 	 + type : sun.net.www.protocol.https.HttpsURLConnectionImpl
//		14:43:55.762  INFO --- [main           ] t.S03_URLConnection.main -  3. getAllowUserInteraction : false
//		14:43:55.762  INFO --- [main           ] t.S03_URLConnection.main -  4. getDefaultAllowUserInteraction : false
//		14:43:55.763  INFO --- [main           ] t.S03_URLConnection.main -  5. getConnectTimeout : 0
//		14:43:56.940  INFO --- [main           ] t.S03_URLConnection.main -  6. getContent : sun.net.www.protocol.http.HttpURLConnection$HttpInputStream@a87f8ec
//		14:43:56.940  INFO --- [main           ] t.S03_URLConnection.main -  7. getContentEncoding : null
//		14:43:56.940  INFO --- [main           ] t.S03_URLConnection.main -  8. getContentType : text/html; charset=UTF-8
//		14:43:56.940  INFO --- [main           ] t.S03_URLConnection.main -  9. getContentLength : -1
//		14:43:56.947  INFO --- [main           ] t.S03_URLConnection.main -  10. getDate : 2022-04-06T14:43:55.000+0900
//		14:43:56.948  INFO --- [main           ] t.S03_URLConnection.main -  11. getDefaultUseCaches : true
//		14:43:56.948  INFO --- [main           ] t.S03_URLConnection.main -  12. getDoInput : true
//		14:43:56.948  INFO --- [main           ] t.S03_URLConnection.main -  13. getDoOutput : false
//		14:43:56.949  INFO --- [main           ] t.S03_URLConnection.main -  14. getExpiration : 0
//		14:43:56.949  INFO --- [main           ] t.S03_URLConnection.main -  15. getHeaderFields : {Transfer-Encoding=[chunked], Keep-Alive=[timeout=5, max=100], null=[HTTP/1.1 200 OK], Server=[Apache], Connection=[Keep-Alive], Set-Cookie=[JSESSIONID_KITA=vZL9ZqE8CR0ujMpC4dK2NhC892iumNBHdnI1JrRw4cxyuueK5oP-!-626979482; path=/; HttpOnly, WMONID=P8-Htj4F4HP; Expires=Thu, 06-Apr-2023 14:43:55 GMT; Path=/], Content-Language=[ko-KR], Date=[Wed, 06 Apr 2022 05:43:55 GMT], Content-Type=[text/html; charset=UTF-8]}
//		14:43:56.949  INFO --- [main           ] t.S03_URLConnection.main -  16. getIfModifiedSince : 0
//		14:43:56.950  INFO --- [main           ] t.S03_URLConnection.main -  17. getLastModified : 1970-01-01T09:00:00.000+0900
//		14:43:56.950  INFO --- [main           ] t.S03_URLConnection.main -  18. getReadTimeout : 0
//		14:43:56.950  INFO --- [main           ] t.S03_URLConnection.main -  19. getURL : https://www.kita.net/cmmrcInfo/cmmrcNews/goodMornKita/goodMornKitaDetail.do
//		14:43:56.951  INFO --- [main           ] t.S03_URLConnection.main -  20. getUseCaches : true
		
//		=====================================================================================
		
	} // main

} // end class

더보기

05. ReadURLContent

package tcp_practice;

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 S04_ReadURLContent {
	
	public static void main(String[] args) throws IOException { // kita에 지정된 사이트의 모든 정보를 가지고 오기 (***)
		
		log.debug("main({}) invoked.", Arrays.toString(args));
		
		// 1. 지정된 URL에 대한 URL 객체 생성
		String url = "https://www.kita.net/cmmrcInfo/cmmrcNews/goodMornKita/goodMornKitaDetail.do";
		URL kita = new URL(url);
		
		// 2. URL 객체를 이용해 실제 지정된 URL 사이트에 접속
		URLConnection urlConn = kita.openConnection();
		
		// 3. 연결된 터널을 통해, 실제 웹자원의 내용을 입력스트림을 이용하여 읽어오자!
		InputStream is  = urlConn.getInputStream();
		
		// 4. 읽어오는 성능을 획지적으로 높이기 위헤 성능향상 보조 스트림을 사용하자!
		BufferedReader br = new BufferedReader( new InputStreamReader(is) );
		
		// 바이트 기반을 문자 기반으로 변환하는 InputStreamReader 보조 스트림과
		// BufferedReader이라는 성능향상 보조스트림을 같이 사용하였다.
		
		try( is; br; ) {
			
			String line;
			
			while((line = br.readLine()) != null) { // EOF : BufferedReader의 경우 EOF의 값은 null이다.
				log.info(line);
			} // while
			
		} // try - with - resource
		
	} // main

} // end class

더보기

06. ReadURLConnection

package tcp_practice;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;

import lombok.extern.log4j.Log4j2;


@Log4j2
public class S05_ReadURLConnectionAndSaveFile {
	
	public static void main(String[] args) throws IOException { // URL에서 가지고 온 정보 파일로 저장하기
		
		String url = "https://www.kita.net/cmmrcInfo/cmmrcNews/goodMornKita/goodMornKitaDetail.do";
		String outFile = "goodMornKitDetail.do.html";
		
//		=============================================================
		
		URL kita = new URL(url);
		
//		=============================================================
		
		InputStream is = kita.openStream(); 
		// 터널을 형성 + 연결 + 자료를 가지고 올 수 있는 InputStream까지 1번에 다 해준다.(**)
		
//		=============================================================
		
		FileOutputStream fos = new FileOutputStream(outFile);
		
		try ( is; fos; ){
			
			int nextByte;
			
			while( (nextByte = is.read()) != -1) {
				
				fos.write(nextByte);
				
			} // while
			
		} // try - with - resource
		
//		=============================================================
		
		File f = new File(outFile);
		
		if(f.exists()) { // 저장된 위치를 출력해 준다.
			log.info("\t + getAbsolutePath : {}", f.getAbsolutePath());
		} // if
		
//		=============================================================
		
		// 출력 :
//		15:06:59.690  INFO --- [main           ] t.S05_ReadURLConnectionAndSaveFile.main - 	 + getAbsolutePath : C:\app\workspace\JSE\project1\goodMornKitDetail.do.html
		
//		=============================================================
		
	} // main

} // end class

더보기

07. ServerSocket

package tcp_practice;

import java.io.IOException;
import java.net.InetSocketAddress;
import java.net.ServerSocket;
import java.util.Arrays;

import lombok.extern.log4j.Log4j2;


@Log4j2
public class S06_ServerSocket {
	
	public static void main (String[] args) throws IOException {
		
		log.debug("main({}) invoked.", Arrays.toString(args));
		// 출력 : 15:15:23.222 DEBUG --- [main           ] t.S06_ServerSocket.main - main([]) invoked.
		
//		========================================================
		
		int listenPort = 7777;
		int backLog = 100;
		
//		========================================================
		
		// 1. 클라이언트의 연결요청을 특정 포트로 받아서, 연결을 수락하고
		// 그 결과로 Socket 객체까지 만들어 내는데, 핵심역할을 하는 객체 생성
		ServerSocket severSocket = new ServerSocket();
		
//		========================================================
		
		// 2. 서버가 특정포트로 listen 할 수 있도록, Port Binding을 수행
		severSocket.bind(new InetSocketAddress(listenPort));
		
		log.info("1. serverSocket : {}",severSocket);
//		출력 : 15:15:23.234  INFO --- [main           ] t.S06_ServerSocket.main - 1. serverSocket : ServerSocket[addr=0.0.0.0/0.0.0.0,localport=7777]
		
		// 이를 통해서 클라이언트와 서버가 가지고 있는 IP주소와 포트번호를 알 수 있다.
		// 0.0.0.0는 IP주소로 ANY 어디에서나 접속할 수 있다는 의미이다.
		
//		========================================================
		
	} // main

} // end class
728x90
댓글
«   2025/06   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
최근에 올라온 글
Total
Today
Yesterday
공지사항