JAVA实现HTTP Server — 浅析HTTP协议

Posted by 孙建 on 2008十月25日 Under [技术分享]J2SE AND 2,555位读者 8 Commented

本文主旨:通过JAVA语言实现一个基于HTTP协议的web服务器来阐释HTTP协议原理
非常郁闷,今天停了一天的电,无语。本来还准备今天早上起来上机的,结果呢,停电郁闷。索性躺床上看书,哈哈,顿时觉得Nmap好强大。几乎可以实施TCP/IP/UDP/ICMP …. 的扫描,还可以分组,分片,自定义HTTP报文,自定义SYN/ACK/RST等等。很黄很暴力…好了书归正传,今天来说说http协议,要很好的理解协议无非就是从最原始的最底层的原理来解析。至于TCP/IP三次握手机制呢,不是今天的内容,就pass掉。直接从请求开始,我们假设链接已经建立完毕了。

下面呢就是我对协议的大致理解,整个请求与响应的过程,抛砖引玉哈。之后呢通过一个基于HTTP协议的JAVA WEB服务器来阐释。

Web Browser Client Request —> serverSocket.accept() —> Processor start()

—> Deal with HTTP Request Package —> Return Protocol Infomation and Request Object

—>Deal With Request Object Which Got From Request —> Return Resault .

再次抛砖引玉哈、、、如下:
首先是server的主程序

  1. package MyServer;
  2.  
  3. /****************************************
  4. * This a simple java http server ..
  5. * Daniel Sun @ 公元2008.10.25
  6. */
  7. import java.io.IOException;
  8. import java.net.ServerSocket;
  9. import java.net.Socket;
  10.  
  11. public class MyServer {
  12.  
  13. private ServerSocket serverSocket;
  14. private static final int HTTP_PORT = 8080;
  15.  
  16. public void startSever(int port) {
  17. //启动
  18.  
  19. try {
  20. serverSocket = new ServerSocket(port);
  21. System.out.println("My Server has Started at port :" + port);
  22. while (true) {
  23. Socket socket = serverSocket.accept(); // Socket socket = serverSocket.accept();
  24. new Processor(socket).start();
  25. }
  26. } catch (IOException e) {
  27. // TODO Auto-generated catch block
  28. e.printStackTrace();
  29. }
  30.  
  31. }
  32.  
  33. public static void main(String[] args) throws Exception {
  34. // TODO Auto-generated method stub
  35. MyServer server = new MyServer();
  36. if (args.length == 1) {
  37. //new MyServer().startSever(Integer.parseInt(args[0]));
  38. server.startSever(Integer.parseInt(args[0]));
  39. } else {
  40. //new MyServer().startSever(HTTP_PORT);
  41. server.startSever(MyServer.HTTP_PORT);
  42. }
  43.  
  44. }
  45.  
  46. }

接下来是处理请求的线程:

  1. package MyServer;
  2.  
  3. import java.io.BufferedReader;
  4. import java.io.File;
  5. import java.io.FileInputStream;
  6. import java.io.FileNotFoundException;
  7. import java.io.IOException;
  8. import java.io.InputStream;
  9. import java.io.InputStreamReader;
  10. import java.io.PrintStream;
  11. import java.net.Socket;
  12.  
  13. public class Processor extends Thread {
  14.  
  15. private InputStream input;
  16. private PrintStream out;
  17. private static final String WEB_ROOT = "D:\\MyDocuments\\workspace\\MyEclipse\\MyServer\\WebRoot";
  18.  
  19. public Processor(Socket socket) {
  20. // 初始化进程
  21. try {
  22. input = socket.getInputStream();
  23. out = new PrintStream(socket.getOutputStream());
  24. } catch (IOException e) {
  25. // TODO Auto-generated catch block
  26. e.printStackTrace();
  27. }
  28.  
  29. }
  30.  
  31. public void run() {
  32. String fileName;
  33. try {
  34. fileName = parse(input);
  35. readFile(fileName);
  36. } catch (IOException e) {
  37. // TODO Auto-generated catch block
  38. e.printStackTrace();
  39. }
  40.  
  41. }
  42.  
  43. public String parse(InputStream input) throws IOException {
  44. // 根据HTTP协议,分析HTTP请求
  45.  
  46. BufferedReader in = new BufferedReader(new InputStreamReader(input));
  47. String httpRequest = in.readLine();
  48. if (httpRequest == null || httpRequest.length() == 0) {
  49. sendError(400, "Client Request Error");
  50. return null;
  51. }
  52.  
  53. String[] requestContent = httpRequest.split(" ");
  54. if (requestContent.length != 3) {
  55. sendError(400, "Client Request Error");
  56. }
  57. String statusCode = requestContent[0];
  58. String requestFileName = requestContent[1];
  59. String protocolVersion = requestContent[2];
  60. System.out.println("Protocal Version :" + protocolVersion
  61. + "\n Request Status Code : " + statusCode
  62. + "\n Request File Name :" + requestFileName);
  63.  
  64. in.close();
  65.  
  66. return requestFileName;
  67.  
  68. }
  69.  
  70. // 文件读写
  71. public void readFile(String fileName) throws IOException {
  72. // 生成一个文件对象
  73. File file = new File(Processor.WEB_ROOT + fileName);
  74. // 判断文件对象是否存在
  75. if (!file.exists()) {
  76. sendError(404, "File Not Found");
  77. }
  78. // 把文件读入输入流
  79. InputStream in = new FileInputStream(file);
  80. // 创建一个与文件长度相等二进制数组,把文件读入
  81. byte[] inputContent = new byte[(int) file.length()];
  82. in.read(inputContent);
  83. out.println("HTTP/1.0 200 sendFile");
  84. out.println("Content-length: " + inputContent.length);
  85. out.println();
  86. out.write(inputContent);
  87. // 把文件从输入流中有输出流读出
  88. out.write(inputContent);
  89. out.flush();
  90. out.close();
  91. in.close();
  92. }
  93.  
  94. public void sendError(int statusCode, String ErrorMessage) {
  95. // 发送错误信息,HTTP请求是否正确,请求的文件是否是授权访问的,文件是否存在
  96. System.out.println("Error Status :" + statusCode);
  97. System.out.println("Error Message :" + ErrorMessage);
  98. }
  99.  
  100. }

读过本文的朋友还浏览过下面这些:

本文关键词:

Post a Comment

(required. But it will not be published)