这本来是前两天发的一个文章
也不知道为什么
就被管理员弄到问答频道去了
在自己的博客列表中,也找不到该文章了
郁闷死
恩
现在重新发一遍
在上次WEB项目的总结中
我就已经花了很多时间
总结了HTTP协议
详细的叙述了HTTP请求,应答
并用Telnet自己写过一个HTTP请求
这次
在山寨Tomcat雏形的时候
因为需要服务器端
根据请求的信息
作出相应回应
而请求信息
又都是通过浏览器封装好的
Http请求类型
在服务器端
通过一个客户线程
使用客户线程的输入流
即可完全得到
经过浏览器封装好的
向服务器端发送的信息
源代码如下
Java代码
/**
* 传入一个Socket对象,解析出通过该对象传入这个链接中的所有HTTP请求信息
*
* @param client
*/
private void getRequset(Socket client) {
try {
InputStream in = client.getInputStream();
InputStreamReader reader = new InputStreamReader(in);
BufferedReader bd = new BufferedReader(reader);//三重封装
String t = null;
while ((t = bd.readLine()) != null) {
System.out.println(t);
parser(t);//解析每一句的方法
}
} catch (Exception ef) {
ef.printStackTrace();
System.out.println("getRequset error--->");
}
}
信息如下
GET /index HTTP/1.1
User-Agent: Opera/9.80 (Windows NT 6.1; U; Edition IBIS; zh-cn) Presto/2.6.30 Version/10.63
Host: localhost:81
Accept: text/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8
Accept-Charset: iso-8859-1, utf-8, utf-16, *;q=0.1
Accept-Encoding: deflate, gzip, x-gzip, identity, *;q=0
Connection: Keep-Alive
//注意,此处两行空格也为HTTP请求的一部分
我们又都知道
在Tomcat中
所有的请求信息
我们都已经封装好
放入一个HttpRequest对象中
在我们自己山寨的Tomcat中
因为得到的Http请求是一个字符串
要得到我们需要的信息
也必须对此字符串进行解析
将解析后的字符串放入一个Request对象中
Requst类源码如下
Java代码
public class Request {
private String method;// 请求方法
private String protocol;// 协议版本
private String requestURL;
private String requestURI;//请求的URI地址 在HTTP请求的第一行的请求方法后面
private String host;//请求的主机信息
private String Connection;//Http请求连接状态信息 对应HTTP请求中的Connection
private String agent;// 代理,用来标识代理的浏览器信息 ,对应HTTP请求中的User-Agent:
private String language;//对应Accept-Language
private String encoding;//请求的编码方式 对应HTTP请求中的Accept-Encoding
private String charset;//请求的字符编码 对应HTTP请求中的Accept-Charset
private String accept;// 对应HTTP请求中的Accept;
getter() setter()
}
有了用来存放封装后信息的Request类
有了请求信息的字符串
接下来
我们只需要将字符串解析
并且存放在Request对象中
源代码如下
Java代码
/**
* 传入HTTP请求中需要解析的某一句 解析该句,并请放入对应的Request对象中
*
* @param s
*/
private void parser(String s) {
if (s.startsWith("GET")) {
String method = "Get";
request.setMethod(method);
int index = s.indexOf("HTTP");
System.out.println("index--->" + index);
String uri = s.substring(3 + 1, index - 1);// 用index-1可以去掉连接中的空格
System.out.println("uri--->" + uri);
request.setRequestURI(uri);
String protocol = s.substring(index);
System.out.println("protocol---->" + protocol);
request.setProtocol(protocol);
} else if (s.startsWith("POST")) {
String method = "POST";
request.setMethod(method);
int index = s.indexOf("HTTP");
System.out.println("index--->" + index);
String uri = s.substring(3 + 1, index - 1);// 用index-1可以去掉连接中的空格
System.out.println("uri--->" + uri);
request.setRequestURI(uri);
String protocol = s.substring(index);
System.out.println("protocol---->" + protocol);
request.setProtocol(protocol);
} else if (s.startsWith("Accept:")) {
String accept = s.substring("Accept:".length() + 1);
System.out.println("accept--->" + accept);
request.setAccept(accept);
} else if (s.startsWith("User-Agent:")) {
String agent = s.substring("User-Agent:".length() + 1);
System.out.println("agent--->" + agent);
request.setAgent(agent);
} else if (s.startsWith("Host:")) {
String host = s.substring("Host:".length() + 1);
System.out.println("host--->" + host);
request.setHost(host);
} else if (s.startsWith("Accept-Language:")) {
String language = s.substring("Accept-Language:".length() + 1);
System.out.println("language--->" + language);
request.setLanguage(language);
} else if (s.startsWith("Accept-Charset:")) {
String charset = s.substring("Accept-Charset:".length() + 1);
System.out.println("charset--->" + charset);
request.setCharset(charset);
} else if (s.startsWith("Accept-Encoding:")) {
String encoding = s.substring("Accept-Encoding:".length() + 1);
System.out.println("encoding--->" + encoding);
request.setEncoding(encoding);
} else if (s.startsWith("Connection:")) {
String connection = s.substring("Connection:".length() + 1);
System.out.println("connection--->" + connection);
request.setConnection(connection);
}
}
封装好请求的Request对象后
接下来
我们就来封装进行应答的Response对象
move on~~~
分享到:
相关推荐
用java解析HTTP请求报头
HTTP头字段包括4类: general-header ; request-header ; response-header ; entity-header
服务端通过是根据请求头中的Content-Type字段来获知请求中的消息主体是用何种方式进行编码,再对消息主体进行解析。具体的编码方式包括: application/x-www-form-urlencoded 最常见post提交数据的方式,以form...
详细介绍了HTTP协议之消息报头中各个属性。
http报头for Arduino生成工具
要解析HTTP报文,需要实现以下操作: 读取HTTP报头提供的各种属性 分析属性值,从中获取内容编码和字符集编码 将报头数据和内容进行分离 判断内容是否文本还是二进制,如果是二进制的则不进行处理 如果内容是文本,...
主要给大家介绍了关于为HttpClient添加默认请求报头的四种解决方案,文中通过示例代码介绍的非常详细,对大家学习或者使用HttpClient具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
科来软件 4.1-IP报头结构实验科来软件 4.1-IP报头结构实验科来软件 4.1-IP报头结构实验科来软件 4.1-IP报头结构实验科来软件 4.1-IP报头结构实验科来软件 4.1-IP报头结构实验科来软件 4.1-IP报头结构实验科来软件 ...
将pcapedit 和 配置文件放到用一路径下,处理处的结果文件保存在当前路径。 [root@localhost cll]# ./pcapedit Input the pcap file name:3g_ctrl_data.pcap //符合帧格式的pcap文件处理结果 starting parse pcap ...
客户端HTTP请求 URL只是标识资源的位置,而HTTP是用来提交和获取资源。客户端发送一个HTTP请求到服务器的请求消息,包括以下格式: 请求行、请求头部、空行、请求数据 一个典型的HTTP请求 GET ...
用java写的一个抓取http报头的代码,希望对大家有帮助
自己封装HTTP报头,发送服务器,接受返回信息!用于新手学习!
delphi操作IdHTTP报头读写 delphi操作IdHTTP报头读写
C语言实现的HTTP解析器,提供请求和响应报文的解析功能,可用于高性能的HTTP应用程序中。它不使用任何系统调用及内存分配的功能,并且不缓冲任何数据,可以被随时中断使用。根据你的系统架构,它处理一个请求只消耗...
python中使用urllib2伪造http报头的2个方法.docx
Tiny Go Web服务器,可输出操作系统信息和HTTP请求以输出 用法 路径 /data?size=n[&unit=u] :创建大小为n的响应。 如果指定了度量单位,则接受以下值: KB , MB , GB , TB (可选,默认值:字节)。 /echo :...
第06章:Servlet与JSP核心技术课程--6、http请求报头-http请求报头(1).rmvb 第06章:Servlet与JSP核心技术课程--6、http请求报头-http请求报头(2).rmvb 第07章:Servlet与JSP核心技术课程--7、http状态代码-http状态...
该ppt是关于移动IPv6的一个经典描述,包括其报头和基本的工作流程
ip、tcp、udp_报头结构体分析.pdf