BinCat V1-简单的请求文件访问处理

实现一个简单的Web服务器非常容易,使用ServerSocket在服务器端监听端口并等待浏览器请求,一旦接收到浏览器数据后就开始解析Http协议,最后将服务器端请求处理完后通过Socket返回给浏览器即可。

image-20200909171226930

V1版本,我们先实现一个简单的读取服务器静态文件的功能,在后续版逐渐完善。

BinCatServerV1实现代码:

  1. package com.anbai.sec.server;
  2. import java.io.*;
  3. import java.net.ServerSocket;
  4. import java.net.Socket;
  5. import java.util.logging.Logger;
  6. /**
  7. * ServerSocket示例
  8. */
  9. public class BinCatServerV1 {
  10. private static final Logger LOG = Logger.getLogger("info");
  11. public static void main(String[] args) {
  12. try {
  13. // 设置服务监听端口
  14. int port = 8080;
  15. // 设置服务名称
  16. String serverName = "BinCat-0.0.1";
  17. // 创建ServerSocket,监听本地端口
  18. ServerSocket ss = new ServerSocket(port);
  19. LOG.info(serverName + " 启动成功,监听端口: " + port);
  20. while (true) {
  21. // 等待客户端连接
  22. Socket socket = ss.accept();
  23. try {
  24. // 获取Socket输入流对象
  25. InputStream in = socket.getInputStream();
  26. // 获取Socket输出流对象
  27. OutputStream out = socket.getOutputStream();
  28. // 创建输出流对象
  29. BufferedReader br = new BufferedReader(new InputStreamReader(in));
  30. // 从Socket中读取一行数据
  31. String str = br.readLine();
  32. if (str == null) {
  33. continue;
  34. }
  35. // 切割请求Http协议信息
  36. String[] strs = str.split("\\s+");
  37. // 解析Http请求URL地址
  38. String url = strs[1];
  39. // 输出服务器返回信息
  40. String msg = "";
  41. // 当前服务器运行目录下的文件
  42. File file = new File(System.getProperty("user.dir"), url);
  43. if (file.exists()) {
  44. out.write("HTTP/1.1 200 OK\n".getBytes());
  45. msg = file.getAbsolutePath();
  46. } else {
  47. out.write("HTTP/1.1 404 Not Found\n".getBytes());
  48. msg = file.getAbsolutePath() + " Not Found!";
  49. }
  50. // 输出返回字节数
  51. out.write(("Content-Length: " + msg.getBytes().length + "\n").getBytes());
  52. // 写入换行
  53. out.write("\n".getBytes());
  54. // 将读取到的数据写入到客户端Socket
  55. out.write(msg.getBytes());
  56. in.close();
  57. out.close();
  58. } catch (IOException e) {
  59. LOG.info("处理客户端请求异常:" + e);
  60. } finally {
  61. socket.close();
  62. }
  63. }
  64. } catch (IOException e) {
  65. e.printStackTrace();
  66. }
  67. }
  68. }

启动BinCat服务后控制台将输出:

  1. 九月 09, 2020 5:18:50 下午 com.anbai.sec.server.BinCatServerV1 main
  2. 信息: BinCat-0.0.1启动成功,监听端口:8080

浏览器请求localhost:8080即可在浏览器中输出当前请求的文件是否存在:

image-20200909172152042

请求一个不存在的文件地址,浏览器将会输出错误信息,如请求localhost:8080/test

image-20200909213525425

从上图中我们可以看到响应的状态码和body都能够正确的被浏览器解析。