🌑 네트워킹 (Networking)
✔️ 클라이언트 / 서버 (Client / Server)
🔹네트워킹 (Networking) ?
- 두 대 이상의 컴퓨터를 케이블로 연결하여 네트워크를 구성하는 것
➜ 컴퓨터들을 연결해서 (1)데이터를 손쉽게 주고 받거나 (2)자원프린터와 같은 주변기기를 함께 공유하기 위해 사용
🔹 서버 ? 클라이언트 ?
- Server : 서비스를 제공하는 컴퓨터(Service Provider)
- Client : 서비스를 사용하는 컴퓨터(Service User)
🔹 서비스 ?
- 서버가 클라이언트로부터 요청받은 작업을 처리하여 그 결과를 제공하는 것을 뜻한다
- 서버가 제공하는 서비스의 종류에 따라
- 파일 서버 (File server)
- 메일 서버 (Mail server)
- 어플리케이션 서버 (Application server)
- 파일 서버 (File server)
- 하나의 서버가 여러 가지 서비스를 제공하기도 하고, 하나의 서비스를 여러 대의 서버로 제공
- 서버가 서비스를 제공하기 위해선 서버프로그램이 필요
클라이언트가 서비스를 제공받기 위해선 서버프로그램과 연결할 수 있는 클라이언트 프로그램이 있어야 한다
ex) 웹서버에 접속하여 정보를 얻기 위해선 웹브라우저(클라이언트 프로그램)이 있어야 한다
🔹 네트워크 모델 - 서버기반모델 & P2P모델
- 컴퓨터와 컴퓨터가 통신하는 구조 (아키텍처)
- 서버기반모델(server-vased model) : 네트워크를 구상할 때 전용서버를 두는 것
(+) 안정적인 서비스 제공
(+) 공유 데이터 관리와 보안이 용이
(-) 서버구축비용과 관리비용 발생 - P2P모델(peer-to-peer) : 별도의 전용서버없이 각 클라이언트가 서버역할을 동시에 수행하는 것
(+) 서버구축 및 운용비용 절감
(+) 자원의 활용 극대화
(-) 자원의 관리가 어렵고 보안이 취약
✔️ IP 주소 (IP address)
🔹 IP 주소 ?
- IP 주소 : 컴퓨터(호스트; host)를 구별하는데 사용되는 고유한 값
➜ 인터넷에 연결된 모든 컴퓨터는 IP주소를 갖는다
192.168.10.100 (4byte)
11000000.10101000.00001010.01100100 (32bit)
- IP 주소는 다시 네트워크 주소와 호스트 주소로 나뉜다
- 네트워크 주소
➜ 서로 다른 두 호스트의 IP주소의 네트워크주소가 같다는 것은 두 호스트가 같은 네트워크에 포함되어 있다는 것을 의미 - 호스트 주소
- 네트워크 주소
- 그렇다면, 네트워크 주소는 어떻게 알아낼 수 있을까?
➜ IP주소와 서브넷 마스크(Subnet Mask)를 비트연산자 '&'로 연산하면 IP주소에서 네트워크 주소만을 뽑아낼 수 있다 - 서브넷 마스크 (Subnet Mask) ?
➜ IP 주소를 네트워크 및 호스트 주소로 분리하는 값 (1: 네트워크 주소 / 0: 호스트 주소)
➜ IP 주소에서 네트워크 주소가 차지하는 자리수가 많을수록 호스트 주소의 범위가 줄어들기 때문에 네트워크의 규모가 작아진다
255.255.255.0 (4byte)
11111111.11111111.11111111.00000000 (32bit)
✔️ InetAddress
🔹InetAddress class
- IP주소를 다루기 위한 클래스
- InetAddress class의 메서드
InetAddress (Java Platform SE 8 ) (oracle.com)
InetAddress (Java Platform SE 8 )
Gets the fully qualified domain name for this IP address. Best effort method, meaning we may not be able to return the FQDN depending on the underlying system configuration. If there is a security manager, this method first calls its checkConnect method wi
docs.oracle.com
- 하나의 도메인명(www.naver.com)에 여러 IP주소가 맵핑될 수도 있고 또 그 반대의 경우도 가능하다
➜ 'getAllByName()' 메서드 사용
InetAddress ip = InetAddress.getByName("www.naver.com"); // 도메인명으로 객체 생성
InetAddress ip = InetAddress.getLocalhost(); // Localhost로 객체 생성
InetAddress[] ips = ip.getAllByName("www.naver.com"); // [ www.naver.com/222.122.84.200, ... ]
ip.getHostName(); // www.naver.com
ip.getHostAddress(); // 222.122.84.200
✔️ URL (Uniform Resource Locator)
🔹 URL ?
- URL : 인터넷에 존재하는 여러 서버들이 제공하는 자원에 접근할 수 있는 주소를 표현하기 위한 것
프로토콜://호스트명:포트번호/경로명/파일명?쿼리스트링#참조
https://ukym-tistory.tistory.com/manage/newpost/85?type=post&returnURL=https%3A%2F%2Fukym-tistory.tistory.com%2Fentry%2FJAVA-%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%82%B9-Networking
- 프로토콜
: 자원에 접근하기 위해 서버와 통신하는데 사용되는 통신규약 (http) - 호스트명
: 자원을 제공하는 서버의 이름 (ukym-tistory.tistory.com) - 포트번호
: 통신에 사용되는 서버의 포트번호 (http 프로토콜의 기본 포트 = 80) - 경로명
: 접근하려는 자원이 저장된 서버상의 위치 (/manage/newpost/) - 파일명
: 접근하려는 자원의 이름 (ex. hello.html) - 쿼리
: URL에서 '?' 이후 부분 (type=post&returnURL=https%3A%2F%2Fukym-tistory.tistory.com%2Fentry%2FJAVA-%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%82%B9-Networking) - 참조
: URL에서 '#' 이후의 부분
참고 자료 - [Network] HTTP & HTTPS + 웹의 동작 원리 — Uykm_Note (tistory.com)
[Network] HTTP & HTTPS + 웹의 동작 원리
▼ Why ? HTTP는 서버와 클라이언트가 데이터를 주고 받기 위한 Protocol이기 때문에, 웹이 동작하는 과정을 이해하려면 웹 개발을 하기 위해서 알아야 하는 가장 중요한 개념들 중 하나이다. 그래서
ukym-tistory.tistory.com
🔹 포트 (Port) ?
- 호스트(컴퓨터)가 외부와 통신하기 위한 통로
- 하나의 호스트가 65536개의 포트를 갖고 있으며 포트는 번호로 구별된다
( 보통 하나의 프로세스가 하나의 포트를 차지 ) - 1023번 이하의 포트는 기존의 다른 통신 프로그램들에 의해서 사용되는 경우가 많으므로 가급적 피하기 !
🔹 URL class
- URL class의 메서드
URL (Java Platform SE 8 ) (oracle.com)
URL (Java Platform SE 8 )
Creates a URL object from the specified protocol, host, port number, and file. host can be expressed as a host name or a literal IP address. If IPv6 literal address is used, it should be enclosed in square brackets ('[' and ']'), as specified by RFC 2732;
docs.oracle.com
URL url = new URL(https://ukym-tistory.tistory.com/manage/newpost/85?type=post&returnURL=https%3A%2F%2Fukym-tistory.tistory.com%2Fentry%2FJAVA-%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%82%B9-Networking);
url.getAuthority(); // 호스트명 + 포트 (https://ukym-tistory.tistory.com)
url.getDefaultPort(); // URL 기본 포트 (80)
url.getHost(); // ukym-tistory.tistory.com
url.getPath(); // /manage/newpost/
url.getProtocol(); // https
url.getQuery(); // type=post&returnURL=https%3A%2F%2Fukym-tistory.tistory.com%2Fentry%2FJAVA-%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%82%B9-Networking
✔️ URLConnection
🔹 URLConnection class
- 어플리케이션과 URL간의 통신연결을 나타내는 클래스의 최상위 클래스이며 추상클래스이다
- 이 클래스를 상속받아 구현한 클래스
- HttpURLConnection
- JarURLConnection
- HttpURLConnection
- URLConnection을 통해 연결하고자하는 자원에 접근하고 읽고 쓰기 가능
➜ 그 외에 관련된 정보를 읽고 쓸 수 있는 메서드도 제공
URLConnection (Java Platform SE 8 ) (oracle.com)
URLConnection (Java Platform SE 8 )
Returns a permission object representing the permission necessary to make the connection represented by this object. This method returns null if no permission is required to make the connection. By default, this method returns java.security.AllPermission.
docs.oracle.com
- URLConnection을 생성하고 get메서드들을 통해 관련정보를 얻어서 출력
URL url = new URL("https://ukym-tistory.tistory.com/entry/JAVA-%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%82%B9-Networking");
URLConnection conn = url.openConnection(); // HttpURLConnection 반환
conn.getContentLength();
conn.getContentType(); // text/html;cahrset=UTF-8
conn.getHeaderFields(); // { Cache-Control: no-cache, no-store, max-age=0, must-revalidate, ... }
conn.getURL(); // https://ukym-tistory.tistory.com/entry/JAVA-%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%82%B9-Networking
- URL에 연결하여 그 내용을 읽어온다
➜ 즉, URL에 연결해서 InpuStream을 얻어오는 것 !
( 만일 URL이 유효하지 않으면 'Malformed- URLException' 발생 )
URL url = new URL("https://uijin.tistory.com/166");
BufferedReader input = new BufferedReader(new InputStreamReader(url.openStream()));
String line = "";
while((line = input.readLine()) != null)
System.out.println(line);
🔻 'openStream()'
= 'openConnection()'을 호출 (URLConnection을 얻는다)
➜ 여기에 다시 'getInputStream()'을 호출
🔻 읽어올 데이터가 문자데이터(.html)이기 때문에 BufferdReader를 사용했다
➜ 만약, 읽어올 데이터가 이미지라면 FileOutputStream을 사용해야 한다 !
( 받아오는 데이터에 맞게 스트림을 생성하기 )
🌒 소켓 프로그래밍
✔️ TCP & UDP
🔹소켓 프로그래밍 ?
- 소켓(프로세스간의 통신에 사용되는 양쪽 끝단; Endpoint)을 이용한 통신 프로그래밍
➜ 자바에서는 소켓통신에 사용되는 프로토콜에 따라 다른 종류의 소켓을 구현하여 제공 - java.net 패키지를 통해 소켓 프로그래밍을 지원
java.net (Java Platform SE 8 ) (oracle.com)
java.net (Java Platform SE 8 )
Interface Summary Interface Description ContentHandlerFactory This interface defines a factory for content handlers. CookiePolicy CookiePolicy implementations decide which cookies should be accepted and which should be rejected. CookieStore A CookieStore
docs.oracle.com
🔹TCP & UDP
- TCP/IP 프로토콜
: 서로 다른 프로세스(or 컴퓨터)간의 통신을 위한 표준 프로토콜로 프로토콜의 집합이다
➜ TCP와 UDP도 이에 포함되며, OSI 7계층의 "전송 계층(transport layer)"에 해당하는 프로토콜이다

- 장단점을 잘 확인해서 어플리케이션 특징에 따라 적절한 프로토콜(TCP or UDP)을 선택하자
TCP | UDP | |
연결방식 | 연결 기반 - 연결 후 통신 - 1:1 통신방식 |
비연결기반 - 연결없이 통신 - 1:1, 1:n, n:n 통신방식 |
특징 | 데이터의 경계를 구분X 신뢰성 있는 데이터 전송 - 데이터의 전송 순서 보장 - 데이터의 수신여부확인 - 패킷을 관리할 필요X 전송속도가 느림 |
데이터의 경계를 구분 신뢰성 없는 데이터 전송 - 순서 보장X - 수신여부 확인X - 패킷 관리 필요 전송속도가 빠름 |
관련 클래스 | Socket ServerSocket |
DatagramSocket DatagramPacket MulticastSocket |
✔️ TCP소켓 프로그래밍
🔹 TCP소켓 프로그래밍 ?
- 클라이언트와 서버간의 일대일 통신이다
- 먼저 서버 프로그램이 실행되어 클라이언트 프로그램의 연결요청을 기다리고 있어야 한다
- 통신 과정
1️⃣ 서버 프로그램에서는 서버소켓(ServerSocket)을 사용해서 서버 컴퓨터의 특정 포트에서 클라이언트의 연결 요청을 처리할 준비를 함
2️⃣ 클라이언트 프로그램은 접속할 서버의 IP주소와 포트 정보를 가지고 소켓(Socket)을 생성해서 서버에 연결을 요청
3️⃣ 서버소켓은 클라이언트의 연결 요청을 받으면, 서버에 새로운 소켓(Socket)을 생성해서 클라이언트 소켓과 연결
4️⃣ 클라이언트 소켓과 서버 프로그램의 새로운 소켓이 일대일 통신 (서버소켓은 관여X)
- 서버소켓은 포트를 독점하기 때문에, 다른 소켓과 포트를 공유 X
( 하나의 포트는 여러 개의 소켓이 공유해서 사용 가능 ) - 서버소켓은 소켓간의 연결만 처리하고 실제 데이터는 소켓들끼리 주고 받는다
🔹 소켓끼리 데이터를 주고 받는 방식 ➜ 입출력스트림
- 소켓은 두 개의 스트림(입력 + 출력)을 가지고 있으며, 이 스트림들은 연결된 상대편 소켓의 스트림들과 교차연결된다
🔹 Socket & ServerSocket
- Socket
: 프로세스간의 통신을 담당하며, InputStream과 OutputStream을 갖고 있다
➜ 이 두 스트림을 통해 프로세스간의 통신(입출력)이 이루어진다
ServerSocket (Java Platform SE 8 ) (oracle.com)
ServerSocket (Java Platform SE 8 )
Create a server with the specified port, listen backlog, and local IP address to bind to. The bindAddr argument can be used on a multi-homed host for a ServerSocket that will only accept connect requests to one of its addresses. If bindAddr is null, it wil
docs.oracle.com
- ServerSocket
: 포트와 연결(bine)되어 외부의 연결요청을 기다리다 연결요청이 들어오면, Socket을 생성해서 소켓과 소켓간의 통신이 이루어지도록 한다
➜ 한 포트에 하나의 ServerSocket만 연결할 수 있다
( 프로토콜이 다르면 같은 포트를 공유할 수 있다 )
Socket (Java Platform SE 8 ) (oracle.com)
Socket (Java Platform SE 8 )
This class implements client sockets (also called just "sockets"). A socket is an endpoint for communication between two machines. The actual work of the socket is performed by an instance of the SocketImpl class. An application, by changing the socket fac
docs.oracle.com
✔️ UDP소켓 프로그래밍
🔹 UDP소켓 프로그래밍
- TCP소켓 프로그래밍에서는 Socket과 ServerSocket을 사용하지만,
UDP소켓 프로그래밍에서는 DatagramSocket과 DatagramPaket을 사용 - UDP는 연결지향 프로토콜이 아니기 때문에 ServerSocket이 필요하지 않다 !
- 데이터를 DatagramPaket(헤더+데이터)에 담아서 보낸다
- 헤더에 DatagramPaket을 수신할 호스트의 정보(호스트 주소+포트)가 저장된다
▼ Study📋
☑️ 1023번 이하의 포트는 기존의 다른 통신 프로그램들에 의해서 사용되는 경우가 많으므로 가급적 피하는 것이 좋다
☑️ 웹 페이지를 가져오기(크롤링; Crawling) 위해선 HttpClient나 Jsoup과 같은 라이브러리를 사용하는것이 더 편리하고 안정적 (HTTPS 연결 및 User-Agent 설정 등을 처리하기 쉽게 제공해준다)
☑️ 소켓 관련 내용을 필요할 때마다 찾아서 공부하는 것이 더 도움될 것 같다
▼ 스터디 회고
몇 달간 "자바의 정석" 책을 기반으로 자바 스터디를 진행하면서 드디어 스터디가 끝이 났다. 이 책의 제목처럼 정말 자바의 정석을 다룬 책이기 때문에 2권으로 나눠져있기도 하고 양이 많을 것이라 예상은 했지만.. 스터디 없이 혼자 이 책을 가지고 공부하려 했다면 동기 부여 없이 너무 힘들었을 것 같고 스터디를 참여하기를 잘한 것 같다! 더불어서 책의 내용을 모두 공부해본 것뿐만 아니라 그 과정속에서 생긴 의문점들에 대해서도 스터디부원들끼리 이야기 해볼 수 있었던 점이 너무 좋았다. (스터디 부원들도 1학년부터 해서 4학년까지 다양하게 구성되었던 점 덕분에 다양한 파트에서 의문점을 제기하여 이에 대해 생각해보고 토의해볼 수 있는 기회를 가질 수 있었다.) 이러한 점들 덕분에 혼자 했으면 얻어가지 못했을 부분까지 스터디를 통해 얻어갈 수 있었던 것 같다. 이 스터디 이전까진 정말 Java의 기초정도밖에 모르는 상태였는데, 이젠 뭔가 Java를 이용해서 만들어볼 수 있을 것 같다는 생각이 들고 방학부터 진행하는 동아리 팀프로젝트인 Tool Experts를 통해 웹사이트 개발 프로젝트에 참여해보려고 한다.
🌑 네트워킹 (Networking)
✔️ 클라이언트 / 서버 (Client / Server)
🔹네트워킹 (Networking) ?
- 두 대 이상의 컴퓨터를 케이블로 연결하여 네트워크를 구성하는 것
➜ 컴퓨터들을 연결해서 (1)데이터를 손쉽게 주고 받거나 (2)자원프린터와 같은 주변기기를 함께 공유하기 위해 사용
🔹 서버 ? 클라이언트 ?
- Server : 서비스를 제공하는 컴퓨터(Service Provider)
- Client : 서비스를 사용하는 컴퓨터(Service User)
🔹 서비스 ?
- 서버가 클라이언트로부터 요청받은 작업을 처리하여 그 결과를 제공하는 것을 뜻한다
- 서버가 제공하는 서비스의 종류에 따라
- 파일 서버 (File server)
- 메일 서버 (Mail server)
- 어플리케이션 서버 (Application server)
- 파일 서버 (File server)
- 하나의 서버가 여러 가지 서비스를 제공하기도 하고, 하나의 서비스를 여러 대의 서버로 제공
- 서버가 서비스를 제공하기 위해선 서버프로그램이 필요
클라이언트가 서비스를 제공받기 위해선 서버프로그램과 연결할 수 있는 클라이언트 프로그램이 있어야 한다
ex) 웹서버에 접속하여 정보를 얻기 위해선 웹브라우저(클라이언트 프로그램)이 있어야 한다
🔹 네트워크 모델 - 서버기반모델 & P2P모델
- 컴퓨터와 컴퓨터가 통신하는 구조 (아키텍처)
- 서버기반모델(server-vased model) : 네트워크를 구상할 때 전용서버를 두는 것
(+) 안정적인 서비스 제공
(+) 공유 데이터 관리와 보안이 용이
(-) 서버구축비용과 관리비용 발생 - P2P모델(peer-to-peer) : 별도의 전용서버없이 각 클라이언트가 서버역할을 동시에 수행하는 것
(+) 서버구축 및 운용비용 절감
(+) 자원의 활용 극대화
(-) 자원의 관리가 어렵고 보안이 취약
✔️ IP 주소 (IP address)
🔹 IP 주소 ?
- IP 주소 : 컴퓨터(호스트; host)를 구별하는데 사용되는 고유한 값
➜ 인터넷에 연결된 모든 컴퓨터는 IP주소를 갖는다
192.168.10.100 (4byte)
11000000.10101000.00001010.01100100 (32bit)
- IP 주소는 다시 네트워크 주소와 호스트 주소로 나뉜다
- 네트워크 주소
➜ 서로 다른 두 호스트의 IP주소의 네트워크주소가 같다는 것은 두 호스트가 같은 네트워크에 포함되어 있다는 것을 의미 - 호스트 주소
- 네트워크 주소
- 그렇다면, 네트워크 주소는 어떻게 알아낼 수 있을까?
➜ IP주소와 서브넷 마스크(Subnet Mask)를 비트연산자 '&'로 연산하면 IP주소에서 네트워크 주소만을 뽑아낼 수 있다 - 서브넷 마스크 (Subnet Mask) ?
➜ IP 주소를 네트워크 및 호스트 주소로 분리하는 값 (1: 네트워크 주소 / 0: 호스트 주소)
➜ IP 주소에서 네트워크 주소가 차지하는 자리수가 많을수록 호스트 주소의 범위가 줄어들기 때문에 네트워크의 규모가 작아진다
255.255.255.0 (4byte)
11111111.11111111.11111111.00000000 (32bit)
✔️ InetAddress
🔹InetAddress class
- IP주소를 다루기 위한 클래스
- InetAddress class의 메서드
InetAddress (Java Platform SE 8 ) (oracle.com)
InetAddress (Java Platform SE 8 )
Gets the fully qualified domain name for this IP address. Best effort method, meaning we may not be able to return the FQDN depending on the underlying system configuration. If there is a security manager, this method first calls its checkConnect method wi
docs.oracle.com
- 하나의 도메인명(www.naver.com)에 여러 IP주소가 맵핑될 수도 있고 또 그 반대의 경우도 가능하다
➜ 'getAllByName()' 메서드 사용
InetAddress ip = InetAddress.getByName("www.naver.com"); // 도메인명으로 객체 생성
InetAddress ip = InetAddress.getLocalhost(); // Localhost로 객체 생성
InetAddress[] ips = ip.getAllByName("www.naver.com"); // [ www.naver.com/222.122.84.200, ... ]
ip.getHostName(); // www.naver.com
ip.getHostAddress(); // 222.122.84.200
✔️ URL (Uniform Resource Locator)
🔹 URL ?
- URL : 인터넷에 존재하는 여러 서버들이 제공하는 자원에 접근할 수 있는 주소를 표현하기 위한 것
프로토콜://호스트명:포트번호/경로명/파일명?쿼리스트링#참조
https://ukym-tistory.tistory.com/manage/newpost/85?type=post&returnURL=https%3A%2F%2Fukym-tistory.tistory.com%2Fentry%2FJAVA-%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%82%B9-Networking
- 프로토콜
: 자원에 접근하기 위해 서버와 통신하는데 사용되는 통신규약 (http) - 호스트명
: 자원을 제공하는 서버의 이름 (ukym-tistory.tistory.com) - 포트번호
: 통신에 사용되는 서버의 포트번호 (http 프로토콜의 기본 포트 = 80) - 경로명
: 접근하려는 자원이 저장된 서버상의 위치 (/manage/newpost/) - 파일명
: 접근하려는 자원의 이름 (ex. hello.html) - 쿼리
: URL에서 '?' 이후 부분 (type=post&returnURL=https%3A%2F%2Fukym-tistory.tistory.com%2Fentry%2FJAVA-%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%82%B9-Networking) - 참조
: URL에서 '#' 이후의 부분
참고 자료 - [Network] HTTP & HTTPS + 웹의 동작 원리 — Uykm_Note (tistory.com)
[Network] HTTP & HTTPS + 웹의 동작 원리
▼ Why ? HTTP는 서버와 클라이언트가 데이터를 주고 받기 위한 Protocol이기 때문에, 웹이 동작하는 과정을 이해하려면 웹 개발을 하기 위해서 알아야 하는 가장 중요한 개념들 중 하나이다. 그래서
ukym-tistory.tistory.com
🔹 포트 (Port) ?
- 호스트(컴퓨터)가 외부와 통신하기 위한 통로
- 하나의 호스트가 65536개의 포트를 갖고 있으며 포트는 번호로 구별된다
( 보통 하나의 프로세스가 하나의 포트를 차지 ) - 1023번 이하의 포트는 기존의 다른 통신 프로그램들에 의해서 사용되는 경우가 많으므로 가급적 피하기 !
🔹 URL class
- URL class의 메서드
URL (Java Platform SE 8 ) (oracle.com)
URL (Java Platform SE 8 )
Creates a URL object from the specified protocol, host, port number, and file. host can be expressed as a host name or a literal IP address. If IPv6 literal address is used, it should be enclosed in square brackets ('[' and ']'), as specified by RFC 2732;
docs.oracle.com
URL url = new URL(https://ukym-tistory.tistory.com/manage/newpost/85?type=post&returnURL=https%3A%2F%2Fukym-tistory.tistory.com%2Fentry%2FJAVA-%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%82%B9-Networking);
url.getAuthority(); // 호스트명 + 포트 (https://ukym-tistory.tistory.com)
url.getDefaultPort(); // URL 기본 포트 (80)
url.getHost(); // ukym-tistory.tistory.com
url.getPath(); // /manage/newpost/
url.getProtocol(); // https
url.getQuery(); // type=post&returnURL=https%3A%2F%2Fukym-tistory.tistory.com%2Fentry%2FJAVA-%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%82%B9-Networking
✔️ URLConnection
🔹 URLConnection class
- 어플리케이션과 URL간의 통신연결을 나타내는 클래스의 최상위 클래스이며 추상클래스이다
- 이 클래스를 상속받아 구현한 클래스
- HttpURLConnection
- JarURLConnection
- HttpURLConnection
- URLConnection을 통해 연결하고자하는 자원에 접근하고 읽고 쓰기 가능
➜ 그 외에 관련된 정보를 읽고 쓸 수 있는 메서드도 제공
URLConnection (Java Platform SE 8 ) (oracle.com)
URLConnection (Java Platform SE 8 )
Returns a permission object representing the permission necessary to make the connection represented by this object. This method returns null if no permission is required to make the connection. By default, this method returns java.security.AllPermission.
docs.oracle.com
- URLConnection을 생성하고 get메서드들을 통해 관련정보를 얻어서 출력
URL url = new URL("https://ukym-tistory.tistory.com/entry/JAVA-%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%82%B9-Networking");
URLConnection conn = url.openConnection(); // HttpURLConnection 반환
conn.getContentLength();
conn.getContentType(); // text/html;cahrset=UTF-8
conn.getHeaderFields(); // { Cache-Control: no-cache, no-store, max-age=0, must-revalidate, ... }
conn.getURL(); // https://ukym-tistory.tistory.com/entry/JAVA-%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%82%B9-Networking
- URL에 연결하여 그 내용을 읽어온다
➜ 즉, URL에 연결해서 InpuStream을 얻어오는 것 !
( 만일 URL이 유효하지 않으면 'Malformed- URLException' 발생 )
URL url = new URL("https://uijin.tistory.com/166");
BufferedReader input = new BufferedReader(new InputStreamReader(url.openStream()));
String line = "";
while((line = input.readLine()) != null)
System.out.println(line);
🔻 'openStream()'
= 'openConnection()'을 호출 (URLConnection을 얻는다)
➜ 여기에 다시 'getInputStream()'을 호출
🔻 읽어올 데이터가 문자데이터(.html)이기 때문에 BufferdReader를 사용했다
➜ 만약, 읽어올 데이터가 이미지라면 FileOutputStream을 사용해야 한다 !
( 받아오는 데이터에 맞게 스트림을 생성하기 )
🌒 소켓 프로그래밍
✔️ TCP & UDP
🔹소켓 프로그래밍 ?
- 소켓(프로세스간의 통신에 사용되는 양쪽 끝단; Endpoint)을 이용한 통신 프로그래밍
➜ 자바에서는 소켓통신에 사용되는 프로토콜에 따라 다른 종류의 소켓을 구현하여 제공 - java.net 패키지를 통해 소켓 프로그래밍을 지원
java.net (Java Platform SE 8 ) (oracle.com)
java.net (Java Platform SE 8 )
Interface Summary Interface Description ContentHandlerFactory This interface defines a factory for content handlers. CookiePolicy CookiePolicy implementations decide which cookies should be accepted and which should be rejected. CookieStore A CookieStore
docs.oracle.com
🔹TCP & UDP
- TCP/IP 프로토콜
: 서로 다른 프로세스(or 컴퓨터)간의 통신을 위한 표준 프로토콜로 프로토콜의 집합이다
➜ TCP와 UDP도 이에 포함되며, OSI 7계층의 "전송 계층(transport layer)"에 해당하는 프로토콜이다

- 장단점을 잘 확인해서 어플리케이션 특징에 따라 적절한 프로토콜(TCP or UDP)을 선택하자
TCP | UDP | |
연결방식 | 연결 기반 - 연결 후 통신 - 1:1 통신방식 |
비연결기반 - 연결없이 통신 - 1:1, 1:n, n:n 통신방식 |
특징 | 데이터의 경계를 구분X 신뢰성 있는 데이터 전송 - 데이터의 전송 순서 보장 - 데이터의 수신여부확인 - 패킷을 관리할 필요X 전송속도가 느림 |
데이터의 경계를 구분 신뢰성 없는 데이터 전송 - 순서 보장X - 수신여부 확인X - 패킷 관리 필요 전송속도가 빠름 |
관련 클래스 | Socket ServerSocket |
DatagramSocket DatagramPacket MulticastSocket |
✔️ TCP소켓 프로그래밍
🔹 TCP소켓 프로그래밍 ?
- 클라이언트와 서버간의 일대일 통신이다
- 먼저 서버 프로그램이 실행되어 클라이언트 프로그램의 연결요청을 기다리고 있어야 한다
- 통신 과정
1️⃣ 서버 프로그램에서는 서버소켓(ServerSocket)을 사용해서 서버 컴퓨터의 특정 포트에서 클라이언트의 연결 요청을 처리할 준비를 함
2️⃣ 클라이언트 프로그램은 접속할 서버의 IP주소와 포트 정보를 가지고 소켓(Socket)을 생성해서 서버에 연결을 요청
3️⃣ 서버소켓은 클라이언트의 연결 요청을 받으면, 서버에 새로운 소켓(Socket)을 생성해서 클라이언트 소켓과 연결
4️⃣ 클라이언트 소켓과 서버 프로그램의 새로운 소켓이 일대일 통신 (서버소켓은 관여X)
- 서버소켓은 포트를 독점하기 때문에, 다른 소켓과 포트를 공유 X
( 하나의 포트는 여러 개의 소켓이 공유해서 사용 가능 ) - 서버소켓은 소켓간의 연결만 처리하고 실제 데이터는 소켓들끼리 주고 받는다
🔹 소켓끼리 데이터를 주고 받는 방식 ➜ 입출력스트림
- 소켓은 두 개의 스트림(입력 + 출력)을 가지고 있으며, 이 스트림들은 연결된 상대편 소켓의 스트림들과 교차연결된다
🔹 Socket & ServerSocket
- Socket
: 프로세스간의 통신을 담당하며, InputStream과 OutputStream을 갖고 있다
➜ 이 두 스트림을 통해 프로세스간의 통신(입출력)이 이루어진다
ServerSocket (Java Platform SE 8 ) (oracle.com)
ServerSocket (Java Platform SE 8 )
Create a server with the specified port, listen backlog, and local IP address to bind to. The bindAddr argument can be used on a multi-homed host for a ServerSocket that will only accept connect requests to one of its addresses. If bindAddr is null, it wil
docs.oracle.com
- ServerSocket
: 포트와 연결(bine)되어 외부의 연결요청을 기다리다 연결요청이 들어오면, Socket을 생성해서 소켓과 소켓간의 통신이 이루어지도록 한다
➜ 한 포트에 하나의 ServerSocket만 연결할 수 있다
( 프로토콜이 다르면 같은 포트를 공유할 수 있다 )
Socket (Java Platform SE 8 ) (oracle.com)
Socket (Java Platform SE 8 )
This class implements client sockets (also called just "sockets"). A socket is an endpoint for communication between two machines. The actual work of the socket is performed by an instance of the SocketImpl class. An application, by changing the socket fac
docs.oracle.com
✔️ UDP소켓 프로그래밍
🔹 UDP소켓 프로그래밍
- TCP소켓 프로그래밍에서는 Socket과 ServerSocket을 사용하지만,
UDP소켓 프로그래밍에서는 DatagramSocket과 DatagramPaket을 사용 - UDP는 연결지향 프로토콜이 아니기 때문에 ServerSocket이 필요하지 않다 !
- 데이터를 DatagramPaket(헤더+데이터)에 담아서 보낸다
- 헤더에 DatagramPaket을 수신할 호스트의 정보(호스트 주소+포트)가 저장된다
▼ Study📋
☑️ 1023번 이하의 포트는 기존의 다른 통신 프로그램들에 의해서 사용되는 경우가 많으므로 가급적 피하는 것이 좋다
☑️ 웹 페이지를 가져오기(크롤링; Crawling) 위해선 HttpClient나 Jsoup과 같은 라이브러리를 사용하는것이 더 편리하고 안정적 (HTTPS 연결 및 User-Agent 설정 등을 처리하기 쉽게 제공해준다)
☑️ 소켓 관련 내용을 필요할 때마다 찾아서 공부하는 것이 더 도움될 것 같다
▼ 스터디 회고
몇 달간 "자바의 정석" 책을 기반으로 자바 스터디를 진행하면서 드디어 스터디가 끝이 났다. 이 책의 제목처럼 정말 자바의 정석을 다룬 책이기 때문에 2권으로 나눠져있기도 하고 양이 많을 것이라 예상은 했지만.. 스터디 없이 혼자 이 책을 가지고 공부하려 했다면 동기 부여 없이 너무 힘들었을 것 같고 스터디를 참여하기를 잘한 것 같다! 더불어서 책의 내용을 모두 공부해본 것뿐만 아니라 그 과정속에서 생긴 의문점들에 대해서도 스터디부원들끼리 이야기 해볼 수 있었던 점이 너무 좋았다. (스터디 부원들도 1학년부터 해서 4학년까지 다양하게 구성되었던 점 덕분에 다양한 파트에서 의문점을 제기하여 이에 대해 생각해보고 토의해볼 수 있는 기회를 가질 수 있었다.) 이러한 점들 덕분에 혼자 했으면 얻어가지 못했을 부분까지 스터디를 통해 얻어갈 수 있었던 것 같다. 이 스터디 이전까진 정말 Java의 기초정도밖에 모르는 상태였는데, 이젠 뭔가 Java를 이용해서 만들어볼 수 있을 것 같다는 생각이 들고 방학부터 진행하는 동아리 팀프로젝트인 Tool Experts를 통해 웹사이트 개발 프로젝트에 참여해보려고 한다.