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