服务器开发流程:
启动服务器主要流程:
- 创建Socket
- 绑定端口号
- 监听socket套接字
- 等待接收请求
处理请求主要流程:
- 解析
- HTTP请求是行文本格式,我们可以按照行方式从socket中读取首行
- 解析首行,得到对应的方法和url
- 解析url中的QuerryString
- 读取并解析header部分,取出有用的字段
- 根据请求详情决定执行动态逻辑还是静态逻辑
- 如果是get请求,并且在指定目录下能找到,就按静态页面处理
- 如果是get请求,在指定目录下找不到,按动态页面处理
静态页面主要流程:
- 根据url获取到应执行的静态页面的类名称
- 根据文件名后缀,获取响应头
- 将文件内容复制到响应正文中
动态页面主要流程:
- 根据url得到动态页面的名字
- 根据动态页面的名字得到动态页面完整类的名称
- 利用自定义的类加载器,加载该类
- 利用反射,将该类实例化
- 运行此动态页面内的代码
- 将结果展示给用户
错误处理:
- 按行读取失败
- 解析数据失败
- 静态页面处理失败
- 动态页面处理失败
前两种失败,我们自定义异常类将其抛出。
对于后两种失败,我们可以做一个简单处理,在这里我返回一个404响应
博客系统:
由于本次项目我们的主要功能在于HTTP服务器,博客系统是为了展示我们HTTP服务器处理动态请求,因此博客系统做的较为简单。博客系统的所有数据我们放在Redis数据库中。
这边博客系统我们可以分为三部分。第一部分是文章列表页的展示,第二部分是文章的详情页面,第三部分是发布文章的功能。
- 文章列表页:
文章列表页我们只需要展示文章的标题即可,我们首先給每篇文章分配一个随机的唯一的ID,因此我们只需要把文章的ID和文章标题一起放在一个HashMap里即可。当客户端请求文章列表页时,我们遍历这个HashMap,把所有的文章标题进行打印输出即可。 - 文章详情页
文章详情页主要展示的内容就是文章标题和文章内容。由于我们之前已经给每篇文章指定了一个ID,此处我们只需要找到这个ID对应的文章标题和正文,将其进行输出即可。 - 发布文章
发布文章首先需要利用form表单制作一个可以提交文章的页面,此页面包含两个输入框,一个是文章标题,一个是文章正文,并提供一个提交按钮,在点击提交按钮后,我们应该将此文章存入我们的数据库内,并在当前页面做一个重定向,重定向到该文章的文章详情页面。
博客系统的错误处理:
在未发表任何文章时,先请求了文章列表页
请求动态页面时未指定具体请求哪个页面
对于第一种,此时由于数据库内并没有任何数据,给用户返回一个404
对于第二种, 默认跳转到文章列表页