A Simple Web Server
HTTP:Http允许Web服务器和浏览器通过Internet发送并接收数据,是一种基于“请求 - 响应”的协议。
一、HTTP 请求
- 请求方法 - URI - 协议/版本
- 请求头
- 实体
二、HTTP 响应
- 协议 - 状态码 - 描述
- 响应头
- 响应实体段
1 package org.http; 2 3 import java.io.File; 4 import java.io.IOException; 5 import java.io.InputStream; 6 import java.io.OutputStream; 7 import java.net.ServerSocket; 8 import java.net.Socket; 9 10 public class HttpServer 11 { 12 public static final String WEB_ROOT = System.getProperty("user.dir") 13 + File.separator + "WebContent"; 14 15 private static final String SHUTDOWN_COMMAND = "/SHUTDOWN"; 16 17 private final int PORT = 8080; 18 19 private boolean shutdown = false; 20 21 public static void main(String[] args) 22 { 23 HttpServer server = new HttpServer(); 24 server.await(); 25 } 26 27 public void await() 28 { 29 ServerSocket serverSocket = null; 30 try 31 { 32 serverSocket = new ServerSocket(PORT); 33 } 34 catch (IOException e) 35 { 36 e.printStackTrace(); 37 System.exit(1); 38 } 39 // Loop waitting for a request 40 while (!shutdown) 41 { 42 Socket socket = null; 43 InputStream input = null; 44 OutputStream output = null; 45 try 46 { 47 socket = serverSocket.accept(); 48 input = socket.getInputStream(); 49 output = socket.getOutputStream(); 50 51 // create request object and parse 52 Request request = new Request(input); 53 request.parse(); 54 55 // create response object 56 Response response = new Response(output); 57 response.setRequest(request); 58 response.sendStaticResource(); 59 shutdown = request.getUri().equals(SHUTDOWN_COMMAND); 60 } 61 catch (IOException e) 62 { 63 e.printStackTrace(); 64 } 65 finally 66 { 67 try 68 { 69 socket.close(); 70 } 71 catch (IOException e) 72 { 73 e.printStackTrace(); 74 } 75 } 76 77 } 78 } 79 }
1 package org.http; 2 3 import java.io.IOException; 4 import java.io.InputStream; 5 6 public class Request 7 { 8 private InputStream input; 9 private String uri; 10 11 public Request(InputStream input) 12 { 13 this.input = input; 14 } 15 16 public void parse() 17 { 18 StringBuffer request = new StringBuffer(2048); 19 int i; 20 byte[] buffer = new byte[2048]; 21 try 22 { 23 i = input.read(buffer); 24 } 25 catch (IOException e) 26 { 27 e.printStackTrace(); 28 i = -1; 29 } 30 for (int j = 0; j < i; j++) 31 { 32 request.append((char) buffer[j]); 33 } 34 System.out.println(request.toString()); 35 uri = parseUri(request.toString()); 36 } 37 38 private String parseUri(String requestStr) 39 { 40 int index1, index2; 41 index1 = requestStr.indexOf(' '); 42 if (index1 != -1) 43 { 44 index2 = requestStr.indexOf(' ', index1 + 1); 45 if (index2 > index1) 46 { 47 return requestStr.substring(index1 + 1, index2); 48 } 49 } 50 return ""; 51 } 52 53 public String getUri() 54 { 55 return uri; 56 } 57 }
1 package org.http; 2 3 import java.io.File; 4 import java.io.FileInputStream; 5 import java.io.IOException; 6 import java.io.OutputStream; 7 8 public class Response 9 { 10 private static final int BUFFER_SIZE = 1024; 11 private Request request; 12 private OutputStream output; 13 14 public Response(OutputStream output) 15 { 16 this.output = output; 17 } 18 19 public void sendStaticResource() 20 { 21 byte[] bytes = new byte[BUFFER_SIZE]; 22 FileInputStream fis = null; 23 try 24 { 25 File file = new File(HttpServer.WEB_ROOT, request.getUri()); 26 27 if (file.exists()) 28 { 29 fis = new FileInputStream(file); 30 int ch = fis.read(bytes, 0, BUFFER_SIZE); 31 while (ch != -1) 32 { 33 output.write(bytes, 0, ch); 34 ch = fis.read(bytes, 0, BUFFER_SIZE); 35 } 36 } 37 else 38 { 39 String errorMessage = "HTTP/1.1 404 File Not Found\r\n" 40 + "Content-Type : text/html\r\n" + "\r\n" 41 + "<h1>File Not Found</h1>"; 42 output.write(errorMessage.getBytes()); 43 } 44 } 45 catch (Exception e) 46 { 47 e.printStackTrace(); 48 } 49 finally 50 { 51 if (fis != null) 52 try 53 { 54 fis.close(); 55 } 56 catch (IOException e) 57 { 58 e.printStackTrace(); 59 } 60 } 61 62 } 63 64 public void setRequest(Request request) 65 { 66 this.request = request; 67 } 68 }
打印HTTP响应:
1 package org.http; 2 3 import java.io.BufferedReader; 4 import java.io.IOException; 5 import java.io.InputStream; 6 import java.io.InputStreamReader; 7 import java.io.OutputStream; 8 import java.io.PrintWriter; 9 import java.net.Socket; 10 import java.net.UnknownHostException; 11 12 public class Client 13 { 14 public static void main(String[] args) throws Exception 15 { 16 Socket socket = new Socket("127.0.0.1", 8080); 17 OutputStream os = socket.getOutputStream(); 18 InputStream is = socket.getInputStream(); 19 boolean autoFlush = true; 20 PrintWriter out = new PrintWriter(os, autoFlush); 21 BufferedReader in = new BufferedReader(new InputStreamReader(is)); 22 out.println("Get /index.jsp HTTP/1.1"); 23 out.println("Host: localhost:8080"); 24 out.println("Connection: close"); 25 out.println(); 26 27 boolean loop = true; 28 StringBuffer sb = new StringBuffer(8096); 29 while (loop) 30 { 31 if (in.ready()) 32 { 33 int i = 0; 34 do 35 { 36 i = in.read(); 37 sb.append((char) i); 38 } 39 while (i != -1); 40 loop = false; 41 } 42 Thread.sleep(1000); 43 } 44 System.out.println(sb.toString()); 45 socket.close(); 46 } 47 }