HTTP server

  • Java ServerSocket

  • Blocking vs Non-Blocking

  • Readable

  • InputStreamReader

  • CharBuffer

  • Writer

  • OutputStreamWriter

package http_server;

import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.net.ServerSocket;
import java.net.Socket;
import java.nio.CharBuffer;
  
public class App { 
	int port = 8080;
	public static void main(String[] args) throws IOException {
		App app = new App();
		app.run();
	}
	
	/* 
	 * java์—์„œ๋„Œ Server์šฉ์œผ๋กœ ServerSocket์ด๋ผ๋Š” ํด๋ž˜์Šค๋ฅผ ๋ณ„๋„๋กœ ์‚ฌ์šฉํ•œ๋‹ค.
	 * Socket์„ ์ƒ์†ํ•œ ๊ฒƒ์ด ์•„๋‹ˆ๋ผ๋Š” ์ ์— ์œ ์˜
	 */
	private void run() throws IOException {
		// 1. Listen
		ServerSocket listener= new ServerSocket(8080, 0); // port, backlog count
		System.out.println("Listen!"); 
		
		// 2. Accept
		/*
		 * I/O์—์„œ ๊ธฐ๋‹ค๋ฆฌ๋Š” ๊ฒƒ์„ Blocking์ด๋ผ๊ณ  ํ•œ๋‹ค. ํŒŒ์ผ ์ฝ๊ธฐ, ์“ฐ๊ธฐ ๋“ฑ๋„ ๋ชจ๋‘ Blocking์ด์ง€๋งŒ, 
		 * TCPํ†ต์‹ ์—์„œ ๋„คํŠธ์›Œํฌ ์ƒํƒœ ์š”์ธ์— ๋”ฐ๋ผ ์ง€์—ฐ๋  ์ˆ˜ ์žˆ๊ณ , ์ƒ๋Œ€๋ฐฉ์˜ ์š”์ฒญ์ด ์—†๋‹ค๋ฉด ๋์—†์ด ๊ธฐ๋‹ค๋ฆด ์ˆ˜ ์žˆ๋‹ค.
		 * ๋•Œ๋ฌธ์— ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋“œ๋‚˜, ๋น„๋™๊ธฐ, ์ด๋ฒคํŠธ ๊ธฐ๋ฐ˜ ์ฒ˜๋ฆฌ ๋“ฑ์ด ํ•„์š”ํ•˜๋‹ค.
		 */
		
		while(true) { 
			Socket socket = listener.accept();
			System.out.println("Accept!");
			
			// 3. Request 
			Readable reader = new java.io.InputStreamReader(socket.getInputStream());
			CharBuffer charBuffer = CharBuffer.allocate(1_000_000);
			reader.read(charBuffer);
			
			charBuffer.flip();
			System.out.println(charBuffer.toString()); 
			
			// 4. Response
			String body = "Hello world!";
			byte[] bytes = body.getBytes();
			String message = ""
					+ "HTTP/1.1 200 OK\n"
					+ "Content-type: text/html; charset=UTF-8\n"
					+ "Content-Length: " + bytes.length + "\n\n" + body;
			 
			Writer writer = new OutputStreamWriter(socket.getOutputStream());
			writer.write(message);
			writer.flush();
			
			// 5. close
			socket.close();
		} 
	}
}

Last updated