实现一个简单的Web服务器非常容易,使用ServerSocket在服务器端监听端口并等待浏览器请求,一旦接收到浏览器数据后就开始解析Http协议,最后将服务器端请求处理完后通过Socket返回给浏览器即可。
    1. BinCat V1 - 简单的请求文件访问处理 - 图1
    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即可在浏览器中输出当前请求的文件是否存在:
    1. BinCat V1 - 简单的请求文件访问处理 - 图2
    请求一个不存在的文件地址,浏览器将会输出错误信息,如请求localhost:8080/test
    1. BinCat V1 - 简单的请求文件访问处理 - 图3
    从上图中我们可以看到响应的状态码和body都能够正确的被浏览器解析。
    Back