这本来是前两天发的一个文章
也不知道为什么
就被管理员弄到问答频道去了
在自己的博客列表中,也找不到该文章了
郁闷死
恩
现在重新发一遍
在上次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 请求报头 在本文中,我们将学习如何使用 Java 语言解析 HTTP 请求报头。HTTP 请求报头是指客户端向服务端发送请求时所携带的信息,它包含了请求的方法、协议版本、请求 URL、主机信息、代理信息...
### 抓取HTTP报头:Java实现解析与应用 在现代网络编程中,HTTP协议作为互联网数据通信的基础标准,其重要性不言而喻。掌握如何利用编程语言处理HTTP请求和响应是每个开发者必备的技能之一。本文将深入探讨如何使用...
- **解析报头**:识别并提取报头中的关键信息,如源IP、目标IP、端口号、协议类型等。 - **解析负载**:根据报文类型和负载格式,进一步解析负载内容,可能涉及解码编码、处理结构化数据等操作。 - **数据处理**...
总的来说,使用Java 8进行原生的PLC通信是一个技术挑战,需要理解网络编程、协议解析以及工业控制系统的知识。但通过这样的实现,可以在跨平台的环境中灵活地集成PLC控制功能,而无需依赖特定的操作系统或外部库。
值得注意的是,处理HTTP协议时,我们需要确保遵循其规范,正确构建和解析请求和响应。例如,每个报头都需要以回车换行`\r\n`结束,整个消息以两个连续的回车换行`\r\n\r\n`作为结束标志。对于二进制数据,需要设置...
在处理请求时,服务器会解析请求行和报头,根据请求方法执行相应操作,如GET请求可能需要读取并返回指定资源,POST请求可能需要处理附加的数据。一旦准备好响应,服务器将构造一个HTTP响应消息,包括状态码、报头和...
- 常见的数据封装方式包括使用特定的分隔符(如换行符)、固定长度的报头等。 4. **文件分块传输**: - 对于大文件,可以考虑将其分成多个小块进行传输,以减少内存消耗和提高传输效率。 - 每个文件块传输完毕后...
接着,服务器接收到请求后,解析请求信息,生成HTTP响应并发送回浏览器。响应的基本结构如下: 1. 状态行:包含HTTP协议版本、状态码(如200表示成功,404表示未找到)和状态消息。 2. 响应头:包含服务器信息、...
- 自制客户端:修改NetClient以发送包含真实HTTP请求报头的数据,连接到目标服务器并接收响应。 - 构造HTTP响应报头:服务器根据客户端请求构造响应报头,完成类似于真实Web服务器的交互。 实验过程中,学生不仅...
当Java Socket服务器接收到这样的请求时,它解析请求行和报头,然后根据请求的内容生成相应的HTTP响应。响应也遵循固定的格式,包括HTTP版本、状态码(如200表示成功,404表示未找到,503表示服务不可用)和可能的...
在Java中,我们可以使用`java.net.Socket`类来创建客户端连接,而`java.net.ServerSocket`用于服务器端监听连接请求。在C++中,我们可以利用套接字接口(如`socket.h`)来实现相同的功能。 标题中的"Java和C++的...
4. **处理请求**:解析请求行和头部,决定如何响应。 5. **创建响应**:构建响应字符串,包括状态行、头部和消息实体。 6. **发送响应**:通过`Socket`的`OutputStream`写入响应,并关闭连接。 对于二进制数据(如...
3. 2 使用Java Servlet API进行会话管理 3. 2. 1 HttpSession接口 3. 2. 2 管理会话数据 3. 2. 3 购物车实例 3. 2. 4 会话事件 第4章 生成图像 4. 1 HTTP协议中的MIME类型 4. 2 Servlet向客户端返回MIME类型...
包括应用层组成的三种模式、C/S模式和P2P模式的要点、混合式P2P模式的要点、应用层常用协议的功能、Java TCP socket和UDP socket通信...Java对象序列化、HTTP协议数据单元的请求消息和响应消息的形成、传送和提取等内容...
RESTful架构强调使用HTTP方法(如GET、POST、PUT、DELETE等)来明确表示操作类型,从而简化了客户端与服务器之间的通信。 RESTful设计中的关键概念包括: 1. 资源(Resource):在REST架构中,一切皆资源,每个...
标准的HTTP请求报头可以通过注解访问,如@RequestHeader用于获取请求头的属性,而@RequestParam用于获取GET或POST请求的参数。此外,@PathVariable用于RESTful风格的URL中,以获取路径变量的值。对于PUT和DELETE等非...
4. 最后,使用socket编程接口(如Java的Socket或Python的socket模块)的`writen`函数(或等效函数)一次性发送整个报文。 接收报文的过程相对复杂: 1. 当接收到数据时,首先读取前四个字节,这四个字节就是长度...
- 用Java语言编写,遵守所有Java语言的语法规则。 - 在服务器端运行,其`.class`文件由服务器调用和执行。 - 需要遵循Servlet API的规范,继承特定类或实现特定接口,并重写特定的方法来处理客户端请求。 #### ...