我们经常使用别人的服务器进行构建网站,现在我们就自己来写一个自己的服务来使用。
准备工作:下载所需的题材及文档
注:完整项目下载
一、request请求获取
1、了解request请求
在写服务器之前,我们需要知道客户端发送给我们哪些信息?以及要求我们返回哪些信息?经过测试我们能够知道用户客户端发送的信息有以下几点:
客户端发送到服务器端的请求消息,我们称之为请求(request),其实就是一个按照http协议的规则拼接而成的字符串,Request请求消息包含三部分: 请求行 消息报头 请求正文
第一部 请求行
格式:
&本文来源gaodai#ma#com搞@@代~&码*网/nbsp;Method Request-URI HTTP-Version CRLF
各部分分别为:
Method表示请求方法;一般为GET或者POST ;Request-URI是一个统一资源标识符; HTTP-Version表示请求的HTTP协议版本; CRLF表示回车和换行
例如:
GET /test.html HTTP/1.1
第二部 消息报头 http header
例如:
GET /test.html HTTP/1.1
Host: 127.0.0.1:9999
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:47.0) Gecko/20100101 Firefox/47.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-CN,en;q=0.8,zh;q=0.5,en-US;q=0.3
Accept-Encoding: gzip, deflate
Connection: keep-alive
第三部 请求正文 http body
请求头和请求正文之间是一个空行,这个行非常重要,它表示请求头已经结束,接下来的是请求正文。请求正文中可以包含客户提交的字符串信息
注意:在第二部分header和第三部分body之间有个空行,除非没有请求正文(如果你想要亲自看到效果,请参考:浏览器中GET和POST的区别),这是因为用户在浏览网页时提交给服务器的信息是不同的
2、实现
经过以上分析,我们就能够清楚的知道,客户端发送给服务器的请求,请求信息有使用的协议、请求的方法、请求的资源路径、请求的消息报头、判断请求的内容是否为静态资源、判断请求的内容是否为动态资源、判断是否为空请求,为了使用的方便,我们需要将其封装起来,总不能使用一次读取一次吧,这样做实在是太浪费系统资源与时间了,如下代码,就是一个接口类,用于获取客户端发送过来的属性
package com.sample.http; import java.util.Map; // http协议的请求 public interface HttpRequest { //获得请求的协议 public String getProtocol(); //获得请求的方法 public String getRequestMethod(); //获得请求的路径 public String getRequestPath(); //获得请求的消息报头 public Map<String,String> getRequestHeader(); //根据参数的名字获得请求带过来的参数值 public String getParameter(String parameterName); //判断当前请求的否是静态资源 public boolean isStaticResource(); //判断当前请求的否是动态资源 public boolean isDynamicResource(); //判断当前请求的否是为空请求(有些浏览器会自动发送空请求) public boolean isNullRequest(); }