๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
Java·๏ปฟServlet·๏ปฟJSP

[JAVA] TCP ์†Œ์ผ“ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์œผ๋กœ ๊ฐ„๋‹จํ•œ HTTP ํด๋ผ์ด์–ธํŠธ ๊ตฌํ˜„ํ•˜๊ธฐ

by Leica 2020. 2. 2.
๋ฐ˜์‘ํ˜•

JAVA TCP ์†Œ์ผ“ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์œผ๋กœ ๊ฐ„๋‹จํ•œ HTTP ํด๋ผ์ด์–ธํŠธ ๊ตฌํ˜„ํ•˜๊ธฐ

 

HTTP ํ”„๋กœํ† ์ฝœ

HTTP ํ”„๋กœํ† ์ฝœ(Hyper-Text Transfer Protocol)์€ ์›น ๋ธŒ๋ผ์šฐ์ €์™€ ์›น ์„œ๋ฒ„ ์‚ฌ์ด์˜ ๋ฐ์ดํ„ฐ ํ†ต์‹  ๊ทœ์น™์ด๋‹ค.

  1. ์›น ๋ธŒ๋ผ์šฐ์ €๋Š” HTTP ์š”์ฒญ ํ˜•์‹์— ๋”ฐ๋ผ ์›น ์„œ๋ฒ„์— ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๋‚ธ๋‹ค.
  2. ์›น ์„œ๋ฒ„๋Š” ์›น ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ๋ณด๋‚ธ ๋ฐ์ดํ„ฐ๋ฅผ ๋ถ„์„ํ•˜๊ณ  ์š”์ฒญ๋ฐ›์€ ์ผ์„ ์ฒ˜๋ฆฌํ•˜์—ฌ HTTP ์‘๋‹ตํ˜•์‹์— ๋”ฐ๋ผ ์‘๋‹ตํ•œ๋‹ค.

SOAP(Simple Object Access Protocol)๋‚˜ RESTful(REpresentational State Transfer)์€ ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„ ์‚ฌ์ด์— ์„œ๋น„์Šค๋ฅผ ์š”์ฒญํ•˜๊ณ  ์‘๋‹ตํ•˜๋Š” ๋ฐฉ์‹์„ ๋งํ•˜๋Š” ๊ฒƒ์œผ๋กœ HTTP ํ”„๋กœํ† ์ฝœ์„ ์‘์šฉํ•˜๊ฑฐ๋‚˜ ํ™•์žฅํ•œ ๊ธฐ์ˆ ์ด๋‹ค.

WebDAV(World Wide Web Distributed Authoring and Versioning)๊ณผ CalDAV๋Š” ์›น์ƒ์—์„œ ์—ฌ๋Ÿฌ ์‚ฌ๋žŒ์ด ๋ฌธ์„œ, ํŒŒ์ผ, ์บ˜๋ฆฐ๋”๋ฅผ ์‰ฝ๊ฒŒ ํŽธ์ง‘ํ•˜๊ณ  ๊ณต์œ ํ• ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ๊ธฐ์ˆ ์ด๋‹ค. ์ด๊ฒƒ ๋˜ํ•œ HTTP ํ”„๋กœํ† ์ฝœ์˜ ์‘์šฉ ๊ธฐ์ˆ ์ด๋‹ค.

 

HTTP ์š”์ฒญ ํ˜•์‹

๋‹ค์Œ์€ ์›น ๋ธŒ๋ผ์šฐ์ €์—์„œ www.daum.net์œผ๋กœ  ์ ‘์†ํ–ˆ์„ ๋•Œ ์›น ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์›น ์„œ๋ฒ„์—๊ฒŒ ์š”์ฒญํ•˜๋Š” HTTP ์š”์ฒญ ๋ฉ”์‹œ์ง€์˜ ์˜ˆ์ด๋‹ค.

 

01  GET / HTTP/1.1
02  Host: www.daum.net
03  Cache-Control: max-age=0
04  Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
05  User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_0)
AppleWebKit/537.36 (KHTML, like Gecko) Chrome/30.0.1599.101
Safari/537.36
06  Accept-Encoding: gzip,deflate,sdch
07  Accept-Language: ko-KR,ko;q=0.8,en-US;q=0.6,en;q=0.4
08

 

์š”์ฒญ ๋ผ์ธ(Request-Line)

์š”์ฒญ ๋ฉ”์‹œ์ง€์˜ ์ฒซ ๋ผ์ธ์ธ GET / HTTP/1.1์€ ์š”์ฒญ ๋ผ์ธ์œผ๋กœ ๋ฉ”์†Œ๋“œ, ์š”์ฒญ ์ž์›(์š”์ฒญ URI), ํ”„๋กœํ† ์ฝœ ๋ฒ„์ „์œผ๋กœ ๊ตฌ์„ฑ๋œ๋‹ค.

 

GET : ๋ฉ”์†Œ๋“œ

/ : ์š”์ฒญ ์ž์›(์š”์ฒญ URI)

HTTP/1.1 : ํ”„๋กœํ† ์ฝœ ๋ฒ„์ „

 

  • ๋ฉ”์†Œ๋“œ๋Š” ์š”์ฒญ ์ž์›์— ๋Œ€ํ•ด ์›น ์„œ๋ฒ„์—๊ฒŒ ๋‚ด๋ฆฌ๋Š” ๋ช…๋ น์ด๋‹ค. ๋ฉ”์†Œ๋“œ์—๋Š” GET, POST, HEAD, PUT, DELETE, TRACE, CONNECT, OPTIONS ๋“ฑ์ด ์žˆ๋‹ค.
  • ์š”์ฒญ URI๋Š” ์š”์ฒญํ•˜๋Š” ์ž์›์˜ ์‹๋ณ„์ž(๊ฒฝ๋กœ)์ด๋‹ค. ์›น ์„œ๋ฒ„๋Š” ์ด ์‹๋ณ„์ž๋ฅผ ์ด์šฉํ•ด์„œ ํ•ด๋‹น ์ž์›์„ ์ฐพ๋Š”๋‹ค.
  • ํ”„๋กœํ† ์ฝœ ๋ฒ„์ „์€ ์š”์ฒญ ์ •๋ณด๊ฐ€ ์–ด๋–ค ๋ฒ„์ „์— ๋งž์ถ”์–ด ์ž‘์„ฑ๋๋Š”์ง€ ์›น ์„œ๋ฒ„์—๊ฒŒ ์•Œ๋ ค์ฃผ๋Š” ๊ฒƒ์ด๋‹ค.

 

์š”์ฒญ ํ—ค๋”

02~07๋ฒˆ ๋ผ์ธ์€ ์„œ๋ฒ„๊ฐ€ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•  ๋•Œ ์ฐธ๊ณ ํ•˜๋ผ๊ณ  ํด๋ผ์ด์–ธํŠธ์—์„œ ์›น ์„œ๋ฒ„์—๊ฒŒ ์•Œ๋ ค์ฃผ๋Š” ์ •๋ณด์ด๋‹ค. ์ด๋Ÿฐ ์ •๋ณด๋ฅผ ํ—ค๋” ์ •๋ณด๋ผ๊ณ  ํ•œ๋‹ค. ํ—ค๋” ์ด๋ฆ„ : ํ—ค๋” ๊ฐ’ ํ˜•์‹์œผ๋กœ ์ด๋ฃจ์–ด์ง„๋‹ค.

 

  • ์ผ๋ฐ˜ ํ—ค๋”(General-header)๋Š” ์š”์ฒญ, ์‘๋‹ต ๋ชจ๋‘์— ์ ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์š”์ฒญ ํ—ค๋”(Request-header)๋Š” ์š”์ฒญ ํ—ค๋”์— ์ ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์‘๋‹ต ํ—ค๋”(Response-header)๋Š” ์‘๋‹ต ํ—ค๋”์— ์ ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์—”ํ‹ฐํ‹ฐ ํ—ค๋”(Entity-header)๋Š” ๋ณด๋‚ด๊ฑฐ๋‚˜ ๋ฐ›๋Š” ๋ณธ๋ฌธ ๋ฐ์ดํ„ฐ๋ฅผ ์„ค๋ช…ํ•˜๋Š” ํ—ค๋”์ด๋‹ค.

 

์š”์ฒญ ํ—ค๋” ์ค‘ User-Agent๋Š” ํด๋ผ์ด์–ธํŠธ์˜ ์ •๋ณด๋ฅผ ์„œ๋ฒ„์—๊ฒŒ ์•Œ๋ ค์ฃผ๋Š” ํ—ค๋”์ด๋‹ค. ์›น ์„œ๋ฒ„๋Š” ์ด ํ—ค๋”๋ฅผ ๋ถ„์„ํ•ด์„œ ์š”์ฒญ์ž์˜ OS์™€ ๋ธŒ๋ผ์šฐ์ €๋ฅผ ๊ตฌ๋ถ„ํ•œ๋‹ค.

 

๊ณต๋ฐฑ ๋ผ์ธ๊ณผ ์š”์ฒญ ๋ฐ์ดํ„ฐ(Message-Body)

HTTP ์š”์ฒญ ๋ฉ”์‹œ์ง€ ์ค‘ ๋งˆ์ง€๋ง‰ 08๋ฒˆ ๋ผ์ธ์€ ํ—ค๋”์˜ ๋์„ ํ‘œ์‹œํ•œ๋‹ค. ๊ณต๋ฐฑ ๋ผ์ธ ๋‹ค์Œ์—๋Š” ์„œ๋ฒ„์— ๋ณด๋‚ผ ๋ฐ์ดํ„ฐ(Message-body)๊ฐ€ ์˜ค๋Š”๋ฐ ์œ„ ์˜ˆ์‹œ๋Š” GET ์š”์ฒญ์ด๋ฏ€๋กœ ์š”์ฒญ ๋ฉ”์‹œ์ง€๋Š” ๊ณต๋ฐฑ ๋ผ์ธ์œผ๋กœ ๋๋‚œ๋‹ค.

 

HTTP ์‘๋‹ต ํ˜•์‹

๋‹ค์Œ์€ ์›น ๋ธŒ๋ผ์šฐ์ €์—์„œ www.daum.net์œผ๋กœ  ์ ‘์†ํ–ˆ์„ ๋•Œ ์›น ์„œ๋ฒ„๊ฐ€ ์›น ๋ธŒ๋ผ์šฐ์ €์—๊ฒŒ ์‘๋‹ตํ•˜๋Š” HTTP ์‘๋‹ต ๋ฐ์ดํ„ฐ์˜ ์˜ˆ์ด๋‹ค.

 

01  HTTP/1.1 200 OK
02  Date: Fri, 18 Oct 2013 11:36:25 GMT
03  X-UA-Compatible: IE=10
04  Expires: Sat, 01, Jan, 1970 22:00:00 GMT
05  Pragma: no-cache
06  Cache-Control: no-cache, no-store, must-revalidate
07  P3P: CP="ALL DSP COR MON LAW IVDi HIS IVAi DELi SAMi OUR LEG PHY UNI ONL DEM STA INT NAV PUR FIN OTC GOV"
08  Content-Type: text/html;charset=UTF-8
09  Content-Language: ko-KR
10  Vary: Accept-Encoding
11  Content-Encoding: gzip
12  X-UA-Device-Type: pc
13  Content-Length: 34770
14  Connection: close
15
16  <!DOCTYPE html>
17  <html lang="ko">
18  <head>
19  ...(์ค‘๋žต)

 

์ƒํƒœ ๋ผ์ธ(Status-Line)

์‘๋‹ต ๋ฉ”์‹œ์ง€์˜ ์ฒซ ๋ผ์ธ์ธ HTTP/1.1 200 OK๋Š” ์‘๋‹ต ๊ฒฐ๊ณผ์— ๋Œ€ํ•œ ์ƒํƒœ ์ •๋ณด์ด๋‹ค. ํ”„๋กœํ† ์ฝœ ๋ฒ„์ „, ์ƒํƒœ ์ฝ”๋“œ, ์ƒํƒœ ์„ค๋ช…์œผ๋กœ ๊ตฌ์„ฑ๋œ๋‹ค.

 

HTTP/1.1 : HTTP ๋ฒ„์ „

200 : ์ƒํƒœ ์ฝ”๋“œ

OK : ์ƒํƒœ ์„ค๋ช…

 

์ƒํƒœ ์ฝ”๋“œ ์ƒํƒœ ์„ค๋ช…
200 ์š”์ฒญ์ด ์„ฑ๊ณต์ ์œผ๋กœ ์ฒ˜๋ฆฌ๋˜์—ˆ๋‹ค.
301 ์š”์ฒญํ•œ ์ž์›์ด ์ด๋™๋˜์—ˆ๋‹ค.
ํ—ค๋” ์ •๋ณด์— ์ด๋™ ์œ„์น˜๋ฅผ ์•Œ๋ ค์ค„ํ…Œ๋‹ˆ ๋‹ค์‹œ ์š”์ฒญํ•˜๋ผ.
304 ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ž„์‹œ ๋ณด๊ด€ํ•œ ์‘๋‹ต ๊ฒฐ๊ณผ์™€ ๋‹ค๋ฅด์ง€ ์•Š๋‹ค.
400 ์ž˜๋ชป๋œ ์š”์ฒญ
404 ์š”์ฒญํ•œ ์ž์›์„ ์ฐพ์„ ์ˆ˜ ์—†๋‹ค.
500 ์„œ๋ฒ„ ๋‚ด๋ถ€์—์„œ ์˜ค๋ฅ˜ ๋ฐœ์ƒ

ํ‘œ - ์ž์ฃผ ์ ‘ํ•˜๋Š” HTTP ์‘๋‹ต ์ƒํƒœ ์ฝ”๋“œ

 

์‘๋‹ต ํ—ค๋”

HTTP ์‘๋‹ต ๋‚ด์šฉ ์ค‘ 02 ~ 14๋ฒˆ ๋ผ์ธ์€ ์‘๋‹ต ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•  ๋•Œ ์ฐธ๊ณ ํ•˜๋ผ๊ณ  ์›น ๋ธŒ๋ผ์šฐ์ €์—๊ฒŒ ์•Œ๋ ค์ฃผ๋Š” ์ •๋ณด์ด๋‹ค. ํŠนํžˆ Content-Type ํ—ค๋”๋Š” ์„œ๋ฒ„๊ฐ€ ์›น ๋ธŒ๋ผ์šฐ์ €์—๊ฒŒ ๋ณด๋‚ด๋Š” ๋ฐ์ดํ„ฐ์˜ ํ˜•์‹์„ ๋‚˜ํƒ€๋‚ธ๋‹ค. ์›น ๋ธŒ๋ผ์šฐ์ €๋Š” ์ด๊ฒƒ์„ ๋ณด๊ณ  ๋ฐ์ดํ„ฐ๋ฅผ ์ถœ๋ ฅํ• ์ง€, ๋‹ค์šด๋กœ๋“œ ์ฐฝ์„ ๋„์šธ์ง€, ์™ธ๋ถ€ ํ”„๋กœ๊ทธ๋žจ์„ ์‹คํ–‰ํ• ์ง€ ๋“ฑ์„ ๊ฒฐ์ •ํ•œ๋‹ค. Content-Length๋Š” ์›น ๋ธŒ๋ผ์šฐ์ €์—๊ฒŒ ๋ณด๋‚ด๋Š” ๋ฐ์ดํ„ฐ(message-body)์˜ ํฌ๊ธฐ(Byte)์ด๋‹ค.

 

๊ณต๋ฐฑ ๋ผ์ธ๊ณผ ์‘๋‹ต ๋ฐ์ดํ„ฐ(Message-Body)

15๋ฒˆ ๋ผ์ธ์€ ํ—ค๋”์™€ ์‘๋‹ต ๋ฐ์ดํ„ฐ๋ฅผ ๊ตฌ๋ถ„ํ•˜๊ธฐ ์œ„ํ•œ ๊ณต๋ฐฑ ๋ผ์ธ์ด๋‹ค. 16๋ฒˆ ๋ผ์ธ๋ถ€ํ„ฐ ์‘๋‹ต ๋ฐ์ดํ„ฐ์ด๋‹ค.

 

์ด๋ ‡๊ฒŒ ์›น ๋ธŒ๋ผ์šฐ์ €์™€ ์›น ์„œ๋ฒ„๋Š” HTTP ํ˜•์‹์— ๋งž์ถฐ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๋‚ด๊ณ  ๋ฐ›๋Š”๋‹ค.

 

TCP ์†Œ์ผ“ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์œผ๋กœ ๊ฐ„๋‹จํ•œ HTTP ํด๋ผ์ด์–ธํŠธ ๊ตฌํ˜„

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.Socket;

public class SimpleHttpClient {

	public static void main(String[] args) throws Exception {
    	// ์†Œ์ผ“ ๋ฐ ์ž…์ถœ๋ ฅ ์ŠคํŠธ๋ฆผ ์ค€๋น„
		Socket socket = new Socket("www.kocw.net", 80);
		BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
		PrintStream out = new PrintStream(socket.getOutputStream());
		
		// ์š”์ฒญ๋ผ์ธ
		out.println("GET / HTTP/1.1");
		
		// ํ—ค๋”์ •๋ณด
		out.println("Host: www.kocw.net");
		out.println("User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_0)"
				+ " AppleWebKit/537.36 (KHTML, like Gecko)"
				+ " Chrome/30.0.1599.101 Safari/537.36");
		// ๊ณต๋ฐฑ๋ผ์ธ
		out.println();
		
        // ์‘๋‹ต ๋‚ด์šฉ
		String line = null;
		while((line = in.readLine()) != null) {
			System.out.println(line);
		}
		
		in.close();
		out.close();
		socket.close();
	}

}

 

์†Œ์ผ“ ํ”„๋กœ๊ทธ๋ž˜๋ฐ

์†Œ์ผ“ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์€ ํ”„๋กœ์„ธ์Šค๊ฐ„์˜ ํ†ต์‹ ์— ์‚ฌ์šฉ๋˜๋Š” ์–‘์ชฝ ๋๋‹จ(endpoint)๋ฅผ ์˜๋ฏธํ•˜๋Š” ์†Œ์ผ“(socket)์„ ์ด์šฉํ•œ ํ†ต์‹  ํ”„๋กœ๊ทธ๋ž˜๋ฐ์ด๋‹ค. ์ž๋ฐ”์—์„œ๋Š” java.net ํŒจํ‚ค์ง€๋ฅผ ํ†ตํ•ด ์†Œ์ผ“ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ์ง€์›ํ•œ๋‹ค.

 

TCP์†Œ์ผ“ ํ”„๋กœ๊ทธ๋ž˜๋ฐ

TCP์†Œ์ผ“ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์€ ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„๊ฐ„์˜ 1:1 ํ†ต์‹ ์ด๋‹ค.

  1. 1. ์„œ๋ฒ„ ํ”„๋กœ๊ทธ๋žจ์—์„œ ServerSocket์„ ์‚ฌ์šฉํ•ด์„œ ์„œ๋ฒ„ ์ปดํ“จํ„ฐ์˜ ํŠน์ • ํฌํŠธ์—์„œ ํด๋ผ์ด์–ธํŠธ์˜ ์—ฐ๊ฒฐ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•  ์ค€๋น„๋ฅผ ํ•œ๋‹ค.
  2. 2. ํด๋ผ์ด์–ธํŠธ ํ”„๋กœ๊ทธ๋žจ์€ ์ ‘์†ํ•  ์„œ๋ฒ„์˜ ์ •๋ณด๋ฅผ ๊ฐ€์ง€๊ณ  Socket์„ ์ƒ์„ฑํ•ด์„œ ์„œ๋ฒ„์— ์—ฐ๊ฒฐ์„ ์š”์ฒญํ•œ๋‹ค.
  3. 3. ServerSocket์€ ํด๋ผ์ด์–ธํŠธ์˜ ์—ฐ๊ฒฐ์š”์ฒญ์„ ๋ฐ›์œผ๋ฉด ์„œ๋ฒ„์— ์ƒˆ๋กœ์šด Socket์„ ์ƒ์„ฑํ•ด์„œ ํด๋ผ์ด์–ธํŠธ์˜ Socket๊ณผ ์—ฐ๊ฒฐํ•œ๋‹ค.
  4. ์—ฐ๊ฒฐ๋œ ํด๋ผ์ด์–ธํŠธ Socket๊ณผ ์ƒˆ๋กœ ์ƒ์„ฑ๋œ ์„œ๋ฒ„์˜ Socket์€ ServerSocket๊ณผ ๊ด€๊ณ„์—†์ด 1:1 ํ†ต์‹ ์„ ํ•œ๋‹ค.

ServerSocket์€ ํฌํŠธ์™€ ๊ฒฐํ•ฉ(bind)๋˜์–ด ํฌํŠธ๋ฅผ ํ†ตํ•ด ์›๊ฒฉ ์‚ฌ์šฉ์ž์˜ ์—ฐ๊ฒฐ์š”์ฒญ์„ ๊ธฐ๋‹ค๋ฆฌ๋‹ค๊ฐ€ ์—ฐ๊ฒฐ์š”์ฒญ์ด ์˜ฌ๋•Œ๋งˆ๋‹ค ์ƒˆ๋กœ์šด Socket์„ ์ƒ์„ฑํ•ด์„œ ์ƒ๋Œ€ํŽธ Socket๊ณผ ํ†ต์‹ ํ• ์ˆ˜ ์žˆ๋„๋ก ์—ฐ๊ฒฐํ•œ๋‹ค. ์—ฌ๊ธฐ๊นŒ์ง€๊ฐ€ ServerSocket์˜ ์—ญํ• ์ด๊ณ  ์‹ค์ œ ๋ฐ์ดํ„ฐ ํ†ต์‹ ์€ Socket๊ณผ Socket๊ฐ„์— ์ด๋ฃจ์–ด์ง„๋‹ค.

 

์†Œ์ผ“๊ณผ ์ž…์ถœ๋ ฅ ์ŠคํŠธ๋ฆผ

์†Œ์ผ“๋“ค์ด ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ ๋ฐ›๋Š” ์—ฐ๊ฒฐํ†ต๋กœ๋Š” ์ž…์ถœ๋ ฅ์ŠคํŠธ๋ฆผ์ด๋‹ค.

Socket์€ ์ž…๋ ฅ ์ŠคํŠธ๋ฆผ๊ณผ ์ถœ๋ ฅ ์ŠคํŠธ๋ฆผ์„ ๊ฐ–๊ณ  ์žˆ์œผ๋ฉฐ ํ•œ ์†Œ์ผ“์˜ ์ž…๋ ฅ ์ŠคํŠธ๋ฆผ์€ ์ƒ๋Œ€ํŽธ ์†Œ์ผ“์˜ ์ถœ๋ ฅ ์ŠคํŠธ๋ฆผ๊ณผ ์—ฐ๊ฒฐ๋˜๊ณ  ์ถœ๋ ฅ ์ŠคํŠธ๋ฆผ์€ ์ƒ๋Œ€ํŽธ ์†Œ์ผ“์˜ ์ž…๋ ฅ ์ŠคํŠธ๋ฆผ๊ณผ ์—ฐ๊ฒฐ๋œ๋‹ค.

 

Socket๊ณผ ServerSocket ํด๋ž˜์Šค

์ž๋ฐ”์—์„œ๋Š” TCP ์†Œ์ผ“ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ์œ„ํ•ด Socket๊ณผ ServerSocket ํด๋ž˜์Šค๋ฅผ ์ œ๊ณตํ•œ๋‹ค.

Socket : ํ”„๋กœ์„ธ์Šค๊ฐ„์˜ ํ†ต์‹ ์„ ๋‹ด๋‹นํ•˜๋ฉฐ InputStream๊ณผ OutputStream์„ ๊ฐ–๊ณ ์žˆ๋‹ค. ์ด ์ŠคํŠธ๋ฆผ์„ ํ†ตํ•ด ํ”„๋กœ์„ธ์Šค๊ฐ„์˜ ํ†ต์‹ (์ž…์ถœ๋ ฅ)์ด ์ด๋ฃจ์–ด์ง„๋‹ค.

ServerSocket : ํฌํŠธ์™€ ์—ฐ๊ฒฐ(bind)๋˜์–ด ์™ธ๋ถ€์˜ ์—ฐ๊ฒฐ ์š”์ฒญ์„ ๊ธฐ๋‹ค๋ฆฌ๋‹ค๊ฐ€ ์š”์ฒญ์ด ๋“ค์–ด์˜ค๋ฉด Socket์„ ์ƒ์„ฑํ•ด์„œ ์†Œ์ผ“๊ณผ ์†Œ์ผ“๊ฐ„์˜ ํ†ต์‹ ์ด ์ด๋ฃจ์–ด์ง€๋„๋ก ํ•œ๋‹ค. ํ•œ ํฌํŠธ์— ํ•˜๋‚˜์˜ ServerSocket๋งŒ ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ์œผ๋‚˜ ํ”„๋กœํ† ์ฝœ์ด ๋‹ค๋ฅด๋ฉด ๊ฐ™์€ ํฌํŠธ๋ฅผ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

Socket socket = new Socket("www.kocw.net", 80);
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
PrintStream out = new PrintStream(socket.getOutputStream());

1) ์„œ๋ฒ„ ์ •๋ณด๋ฅผ ๊ฐ–๊ณ  Socket์„ ์ƒ์„ฑํ•œ๋‹ค. ์ ‘์†ํ•  ์›น ์„œ๋ฒ„๋Š” KOCW ์‚ฌ์ดํŠธ์ด๊ณ  ์›น ์„œ๋ฒ„์˜ ๊ธฐ๋ณธ ํฌํŠธ๋Š” 80์ด๋‹ค. ์†Œ์ผ“์„ ์ƒ์„ฑํ•˜๋ฉด ์ž๋™์œผ๋กœ ์„œ๋ฒ„์— ์—ฐ๊ฒฐ์š”์ฒญ์„ ํ•œ๋‹ค.

์„œ๋ฒ„์™€ ์—ฐ๊ฒฐ๋˜๋ฉด ์†Œ์ผ“์˜ ์ž…๋ ฅ ์ŠคํŠธ๋ฆผ์„ ์–ป์–ด์„œ(socket.getInputStream()) ์„œ๋ฒ„๊ฐ€ ์ „์†กํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์„ ์ˆ˜ ์žˆ๋‹ค.

InputStreamReader๋Š” ๋ฐ”์ดํŠธ ๊ธฐ๋ฐ˜ ์ŠคํŠธ๋ฆผ์„ ๋ฌธ์ž ๊ธฐ๋ฐ˜ ์ŠคํŠธ๋ฆผ์œผ๋กœ ์—ฐ๊ฒฐํ•ด์ค€๋‹ค.

BufferedReader๋Š” ๋ฒ„ํผ๋ฅผ ์ด์šฉํ•ด์„œ ์ž…์ถœ๋ ฅ์˜ ํšจ์œจ์„ ๋†’์ผ ์ˆ˜ ์žˆ๊ฒŒ ํ•œ๋‹ค. BufferedReader์˜ readLine()์„ ์‚ฌ์šฉํ•˜๋ฉด ๋ฐ์ดํ„ฐ๋ฅผ ๋ผ์ธ ๋‹จ์œ„๋กœ ์ฝ์„ ์ˆ˜ ์žˆ๋‹ค.

PrintStream์€ ๋ฐ์ดํ„ฐ๋ฅผ ๊ธฐ๋ฐ˜ ์ŠคํŠธ๋ฆผ์— ๋‹ค์–‘ํ•œ ํ˜•ํƒœ๋กœ ์ถœ๋ ฅํ•  ์ˆ˜ ์žˆ๋Š” print, println, printf์™€ ๊ฐ™์€ ๋ฉ”์†Œ๋“œ๋ฅผ ์˜ค๋ฒ„๋กœ๋”ฉํ•˜์—ฌ ์ œ๊ณตํ•œ๋‹ค.

 

out.println("GET / HTTP/1.1");

2) ์„œ๋ฒ„์—๊ฒŒ ์ˆ˜ํ–‰ํ•  ์ž‘์—…์„ ์•Œ๋ ค์ฃผ๋Š” ์š”์ฒญ ๋ผ์ธ(request line)์„ ๋ณด๋‚ธ๋‹ค. ์š”์ฒญ ํ˜•์‹(๋ฉ”์†Œ๋“œ)๋Š” GET, ์š”์ฒญ ์ž์›์€ ์›น ์„œ๋ฒ„ ๋ฃจํŠธ ํด๋”์˜ ๊ธฐ๋ณธ ๋ฌธ์„œ(/), ์‚ฌ์šฉํ•  ํ”„๋กœํ† ์ฝœ์€ HTTP, ๋ฒ„์ „์€ 1.1์ด๋‹ค.

 

out.println("Host: www.kocw.net");
out.println("User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_0)"
				+ " AppleWebKit/537.36 (KHTML, like Gecko)"
				+ " Chrome/30.0.1599.101 Safari/537.36");

3) ์›น ์„œ๋ฒ„์— ์š”์ฒญ ํ—ค๋” ์ •๋ณด๋ฅผ ๋ณด๋‚ธ๋‹ค. ์ ‘์†ํ•˜๋ ค๋Š” ์›น ์„œ๋ฒ„์˜ ์ฃผ์†Œ(Host)๋Š” www.kocw.net, ์š”์ฒญ์ž์˜ ์ •๋ณด(User-Agent)๋Š” ํฌ๋กฌ ๋ธŒ๋ผ์šฐ์ €๋ผ๊ณ  ์ž„์˜๋กœ ์„ค์ •ํ•œ๋‹ค.

 

out.println();

4) ์š”์ฒญ ๋ฉ”์‹œ์ง€์˜ ๋์„ ํ‘œ์‹œํ•˜๊ธฐ ์œ„ํ•ด ๊ณต๋ฐฑ ๋ผ์ธ์„ ๋ณด๋‚ธ๋‹ค.

 

String line = null;
while((line = in.readLine()) != null) {
	System.out.println(line);
}

5) ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ๋ฐ›์€ ๋ฐ์ดํ„ฐ๋ฅผ line ๋‹จ์œ„๋กœ ์ฝ์–ด์„œ ์ถœ๋ ฅํ•œ๋‹ค.

 

์‹คํ–‰ ๊ฒฐ๊ณผ :

HTTP ์‘๋‹ต ํ˜•์‹๋Œ€๋กœ ์ฒซ ๋ผ์ธ์€ ์‘๋‹ต ์ƒํƒœ๋ผ์ธ, ๋‘ ๋ฒˆ์งธ ๋ผ์ธ๋ถ€ํ„ฐ ๊ณต๋ฐฑ ๋ผ์ธ๊นŒ์ง€๋Š” ์‘๋‹ต ํ—ค๋”, ๊ณต๋ฐฑ ๋ผ์ธ ๋‹ค์Œ์—๋Š” HTML๋กœ ๋œ ๋ณธ๋ฌธ ๋ฐ์ดํ„ฐ๊ฐ€ ์˜จ๋‹ค. ์ด๋ ‡๊ฒŒ HTTP ๊ทœ์•ฝ์— ๋งž์ถ”์–ด ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๋‚ด๊ณ  ๋ฐ›์œผ๋ฉด HTTP ํด๋ผ์ด์–ธํŠธ๋‚˜ ์„œ๋ฒ„๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.

๋ฐ˜์‘ํ˜•

๋Œ“๊ธ€