티스토리 뷰
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.1은 localhost의 IP주소이다.
- Ping + IP주소를 통해서 해당 IP주소에 연결할 수 있는지 확인해 준다.
3. TCP ( Transmission Control Protocol ) 네트워킹
- 우리가 일상에서 보통 말하는 ‘인터넷’은 네트워크 용어로 “ TCP/IP 네트워크 “라고 부른다.
- 이때 TCP와 IP는 통신규약(protocol)을 의미한다.
- 특징 :
- TCP는 연결 지향적 프로토콜이기에, 연결통로를 먼저 형성하게 되는데 이로 인해서 시간이 소요된다.
- 데이터를 정확하고 안정적으로 전달하며, 통신 선로를 고정하기에 전송 속도가 느려질 수 있다.
- ServerSocket과 Socket 용도 :
- 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
'KH 정보교육원 [ Java ]' 카테고리의 다른 글
KH 30일차 - TCP 네트워킹 및 멀티 스레드 (0) | 2022.04.08 |
---|---|
KH 29일차 - TCP 네트워킹 (0) | 2022.04.07 |
KH - 2차 시험 + 국비 1개월차 후기 (0) | 2022.04.05 |
KH 27일차 - 보조스트림 / 네트워크 (0) | 2022.04.05 |
KH 26일차 - Scanner / File 클래스 (0) | 2022.04.04 |