V3简单的封装了BinCatRequestBinCatResponseBinCatSession,还是先了部分的Servlet API从而实现了一个最初级的Servlet容器
    V3处理流程:

    1. 创建服务端Socket连接(ServerSocket)。
    2. 手动注册Servlet类。
    3. 创建用于处理请求的BinCatRequest对象。
    4. BinCatRequest解析请求协议、请求头、请求参数、Cookie等。
    5. 创建用于处理请求的BinCatResponse对象。
    6. 解析Servlet类的@WebServlet注解,反射调用Servlet类方法处理Http请求。
    7. 输出响应信息以及Servlet处理结果。
    8. 关闭Socket连接。

    BinCatServerV3实现代码:

    1. package com.anbai.sec.server;
    2. import com.anbai.sec.server.servlet.BinCatRequest;
    3. import com.anbai.sec.server.servlet.BinCatResponse;
    4. import com.anbai.sec.server.test.servlet.CMDServlet;
    5. import com.anbai.sec.server.test.servlet.TestServlet;
    6. import org.javaweb.utils.StringUtils;
    7. import javax.servlet.annotation.WebServlet;
    8. import javax.servlet.http.HttpServlet;
    9. import java.io.ByteArrayOutputStream;
    10. import java.io.IOException;
    11. import java.io.InputStream;
    12. import java.io.OutputStream;
    13. import java.net.ServerSocket;
    14. import java.net.Socket;
    15. import java.util.HashSet;
    16. import java.util.Map;
    17. import java.util.Set;
    18. import java.util.concurrent.ConcurrentHashMap;
    19. import java.util.logging.Logger;
    20. import java.util.regex.Pattern;
    21. /**
    22. * ServerSocket Http 服务器示例
    23. */
    24. public class BinCatServerV3 {
    25. private static final Logger LOG = Logger.getLogger("info");
    26. public static void main(String[] args) {
    27. try {
    28. // 设置服务监听端口
    29. int port = 8080;
    30. // 设置服务名称
    31. String serverName = "BinCat-0.0.3";
    32. // 创建ServerSocket,监听本地端口
    33. ServerSocket ss = new ServerSocket(port);
    34. // 初始化Servlet映射类对象
    35. final Set<Class<? extends HttpServlet>> servletList = new HashSet<Class<? extends HttpServlet>>();
    36. // 手动注册Servlet类
    37. servletList.add(TestServlet.class);
    38. servletList.add(CMDServlet.class);
    39. LOG.info(serverName + " 启动成功,监听端口: " + port);
    40. while (true) {
    41. // 等待客户端连接
    42. Socket socket = ss.accept();
    43. try {
    44. // 获取Socket输入流对象
    45. InputStream in = socket.getInputStream();
    46. // 获取Socket输出流对象
    47. OutputStream out = socket.getOutputStream();
    48. // 创建BinCat请求处理对象
    49. BinCatRequest request = new BinCatRequest(socket);
    50. // 创建BinCat请求处理结果输出流
    51. ByteArrayOutputStream baos = new ByteArrayOutputStream();
    52. // 创建BinCat请求处理结果Header对象
    53. Map<String, String> responseHeader = new ConcurrentHashMap<String, String>();
    54. // 创建BinCat响应处理对象
    55. BinCatResponse response = new BinCatResponse(socket, responseHeader, baos);
    56. // 请求URI地址
    57. String uri = request.getRequestURI();
    58. // 处理Http请求URL
    59. for (Class<? extends HttpServlet> clazz : servletList) {
    60. WebServlet webServlet = clazz.getAnnotation(WebServlet.class);
    61. String[] urlPatterns = webServlet.urlPatterns();
    62. for (String urlPattern : urlPatterns) {
    63. try {
    64. // 检测请求的URL地址和Servlet的地址是否匹配
    65. if (Pattern.compile(urlPattern).matcher(uri).find()) {
    66. // 修改状态码
    67. response.setStatus(200, "OK");
    68. // 创建Servlet类实例
    69. HttpServlet httpServlet = clazz.newInstance();
    70. // 调用Servlet请求处理方法
    71. httpServlet.service(request, response);
    72. break;
    73. }
    74. } catch (Exception e) {
    75. // 修改状态码
    76. response.setStatus(500, "Internal Server Error");
    77. e.printStackTrace();
    78. baos.write(("<pre>" + StringUtils.exceptionToString(e) + "</pre>").getBytes());
    79. }
    80. }
    81. }
    82. // 处理Http响应内容
    83. out.write(("HTTP/1.1 " + response.getStatus() + " " + response.getMessage() + "\n").getBytes());
    84. // 输出Web服务器信息
    85. out.write(("Server: " + serverName + "\n").getBytes());
    86. // 输出返回的消息类型
    87. out.write(("Content-Type: " + response.getContentType() + "\n").getBytes());
    88. // 输出返回字节数
    89. out.write(("Content-Length: " + baos.size() + "\n").getBytes());
    90. // 输出用户自定义的Header
    91. for (String key : responseHeader.keySet()) {
    92. out.write((key + ": " + responseHeader.get(key) + "\n").getBytes());
    93. }
    94. // 写入换行
    95. out.write("\n".getBytes());
    96. // 将读取到的数据写入到客户端Socket
    97. out.write(baos.toByteArray());
    98. in.close();
    99. out.close();
    100. } catch (Exception e) {
    101. LOG.info("处理客户端请求异常:" + e);
    102. } finally {
    103. socket.close();
    104. }
    105. }
    106. } catch (IOException e) {
    107. e.printStackTrace();
    108. }
    109. }
    110. }