Задача
За минимальное время написать HTTP сервер, который после запуска сможет корректно ответить браузеру и отдать простую HTML страничку (минимальное время, чтобы кода было мало, чтобы новичку вникать было проще).
У меня это заняло около 15 минут. Сервер вроде справляется с поставленной задачей.
Суть примера — показать что такое Socket, ServerSocket, InputStream, OutputStream, и Thread.
Решение
import java.net.ServerSocket; import java.net.Socket; import java.io.InputStream; import java.io.OutputStream; import java.io.InputStreamReader; import java.io.BufferedReader; /** * Created by yar 09.09.2009 */ public class HttpServer { public static void main(String[] args) throws Throwable { ServerSocket ss = new ServerSocket(8080); while (true) { Socket s = ss.accept(); System.err.println("Client accepted"); new Thread(new SocketProcessor(s)).start(); } } private static class SocketProcessor implements Runnable { private Socket s; private InputStream is; private OutputStream os; private SocketProcessor(Socket s) throws Throwable { this.s = s; this.is = s.getInputStream(); this.os = s.getOutputStream(); } public void run() { try { readInputHeaders(); writeResponse("<html><body><h1>Hello from Habrahabr</h1></body></html>"); } catch (Throwable t) { /*do nothing*/ } finally { try { s.close(); } catch (Throwable t) { /*do nothing*/ } } System.err.println("Client processing finished"); } private void writeResponse(String s) throws Throwable { String response = "HTTP/1.1 200 OK\r\n" + "Server: YarServer/2009-09-09\r\n" + "Content-Type: text/html\r\n" + "Content-Length: " + s.length() + "\r\n" + "Connection: close\r\n\r\n"; String result = response + s; os.write(result.getBytes()); os.flush(); } private void readInputHeaders() throws Throwable { BufferedReader br = new BufferedReader(new InputStreamReader(is)); while(true) { String s = br.readLine(); if(s == null || s.trim().length() == 0) { break; } } } } }
Как запустить
1) Создать файл HttpServer.java
2) В этот файл вставить текст исходника
3) Скомпилировать командой javac HttpServer.java
4) Запустить командой java -cp . HttpServer (при этом порт 8080 должен быть свободным)
5) Открыть браузер и пойти по ссылке http://localhost:8080/