编写自己的一个简单的web容器(二)
昨天我们已经能够确定浏览器的请求能够被我们自己编写的服务类所接收并且我们服务类响应的数据也能够正常发送到浏览器客户端,那么我们今天要解决的问题就是让我们的数据能够被浏览器识别并解析。
Http(Https)协议
我们发送到浏览器的数据如果想要被浏览器正常的解析,那其必须符合http协议规定的数据格式。其请求信息的格式我们已经能够看到如下所示:
我们来简单的分析一下这个请求头信息
1.首先第一行包含了三个信息 :请求类型:get 请求资源路径和参数:/portal/ 该请求的http协议版本。这是请求信息的头行,三种信息之间同空格分隔格式是固定的,其后跟一个换行符标示投行结束。
2.第二行包含了请求指向的主机地址(ip地址或域名)和端口号,其后仍然是一个换行符。
3.剩下的一直到Cookie都是请求的头信息每行后面同样都跟了一个换行符。
4.请求头信息结束后下面空一行(一个换行符)后另起一行跟的是请求正文信息。如果请求类型为Post且表单存在参数时会产生请求正文信息记录表单中的参数。如下图所示
以上就是http协议中请求的数据格式,然而解决我们的问题还需要知道响应的数据格式,后来我在网上也搜素了一些关于http协议的博客,发现响应信息的数据格式如下图类似
响应头第一行也称为状态行,格式如下(下图中红线标出的那行):HTTP-Version 空格 Status-Code 空格 Reason-Phrase CRLF HTTP- Version表示HTTP版本,例如为HTTP/1.1。Status- Code是结果代码,用三个数字表示。Reason-Phrase是个简单的文本描述,解释Status-Code的具体原因。Status-Code用于机器自动识别,Reason-Phrase用于人工理解。Status-Code的第一个数字代表响应类别,可能取5个不同的值。后两个数字没有分类作用。Status-Code的第一个数字代表响应的类别,后续两位描述在该类响应下发生的具体状况,具体请参见:HTTP状态码 。
关于更多http协议的内容推荐大家去这个博客查看:《HTTP协议详解》,
修改之前的代码并测试
在知道了http协议的护具格式之后我们修改之前的代码来进行测试
package cn.wz.net.demo; import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.PrintStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Date; /**
* Created by WangZhe on 2017/5/17.
*/
public class SocketServer {
public static void main(String[] args) throws IOException {
ServerSocket server = new ServerSocket(7777);
Socket accept = server.accept();
DataInputStream dis = new DataInputStream(accept.getInputStream());
byte[] data=new byte[20480];
dis.read(data);
String requserInfo=new String(data);
System.out.println(requserInfo);
DataOutputStream dos = new DataOutputStream(accept.getOutputStream());
String html="<html> <head><title>测试</title></head> <body><div>测试页面</div></body></html>";
StringBuffer responseHead=new StringBuffer();
responseHead.append("HTTP/1.1 200 OK\r\n");
responseHead.append("Server:WZ tomact/0.0.01").append("\r\n");
responseHead.append("Data:").append(new Date()).append("\r\n");
responseHead.append("Content-type:text/html;charset=UTF-8").append("\r\n");
responseHead.append("Content-Length:").append(html.getBytes().length).append("\r\n");
responseHead.append("\r\n");
responseHead.append(html);
dos.writeUTF(responseHead.toString());
dos.flush();
dos.close();
dis.close();
accept.close();
server.close();
}
}
测试demo
运行该类,浏览器请求后的结果如下:
好了到这里我们的web容器已经说是用一个很好的开端了,在接下来的系列博客中我也会一步步的对请求(request)、响应(response)
进行封装,包括解析请求信息,以及如何响应我们已经编写好的html文件给浏览器以及控制器的编写等。请大家持续关注,多多指点,谢谢
编写自己的一个简单的web容器(二)的更多相关文章
- 编写自己的一个简单的web容器(一)
在之前的博客中我更大家说过Http协议是对tcp协议的封装,其底层还是使用tcp协议来进行数据传出的,浏览器实际上就是一个Socket客户端,今天呢我们就开始着手利用ServerSocket来编写一个 ...
- Tomcat详解系列(1) - 如何设计一个简单的web容器
Tomcat - 如何设计一个简单的web容器 在学习Tomcat前,很多人先入为主的对它的认知是巨复杂的:所以第一步,在学习它之前,要打破这种观念,我们通过学习如何设计一个最基本的web容器来看它需 ...
- 一个简单的web服务器例子
一个简单的web容器小例子,功能十分简单,只能访问静态资源,对于新手来说还是有一定的意义.主要分三个类 1.server类:主要功能开启socketServer,阻塞server,接收socket访问 ...
- 使用Java编写一个简单的Web的监控系统cpu利用率,cpu温度,总内存大小
原文:http://www.jb51.net/article/75002.htm 这篇文章主要介绍了使用Java编写一个简单的Web的监控系统的例子,并且将重要信息转为XML通过网页前端显示,非常之实 ...
- 编写一个简单的Web Server
编写一个简单的Web Server其实是轻而易举的.如果我们只是想托管一些HTML页面,我们可以这么实现: 在VS2013中创建一个C# 控制台程序 编写一个字符串扩展方法类,主要用于在URL中截取文 ...
- Docker容器技术-创建一个简单的Web应用
一.创建一个简单的Web应用 1.identicon 基于某个值而自动产生的图像,这个值是IP地址或用户名的散列值. 用途: 通过计算用户名或IP地址的散列值,在网站上提供用于识别用户的图像,以及自动 ...
- 使用Servlet和JSP实现一个简单的Web聊天室系统
1 问题描述 利用Java EE相关技术实现一个简单的Web聊天室系统,具体要求如下. (1)编写一个登录 ...
- Symfony2之创建一个简单的web应用
Symfony2——创建bundle bundle就像插件或者一个功能齐全的应用,我们在应用层上开发的应用的所有代码,包括:PHP文件.配置文件.图片.css文件.js文件等都会包含在bu ...
- Tomcat剖析(一):一个简单的Web服务器
Tomcat剖析(一):一个简单的Web服务器 1. Tomcat剖析(一):一个简单的Web服务器 2. Tomcat剖析(二):一个简单的Servlet服务器 3. Tomcat剖析(三):连接器 ...
随机推荐
- 手机自动化测试:appium源码分析之bootstrap十四
手机自动化测试:appium源码分析之bootstrap十四 poptest(www.poptest.cn)是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开 ...
- 使用 SLF4J + LogBack 构建日志系统(转)
转载自:http://www.cnblogs.com/mailingfeng/p/3499436.html 上次我们讨论了如何选择一个好的开源日志系统方案,其中的结论是:使用 SLF4J + LogB ...
- 抽象工厂模式(Abstract Factory)
(二)抽象工厂模式(Abstract Factory) 1.抽象工厂模式(Abstract Factory),提供了一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类. 2.抽象工厂模式是 ...
- 设置ZooKeeper服务器地址列表源码解析及扩展
设置ZooKeeper服务器地址列表源码解析及扩展 ZooKeeper zooKeeper = new ZooKeeper("192.168.109.130:2181",SESSI ...
- GreenDao与Rx的完美搭配
作为Android开发者,一定不会对 GreenDao 和 ReactiveX 陌生. GreenDao 号称Android最快的关系型数据库 ReactiveX Rx是一个编程模型,目标是 ...
- 关于css禁止文本复制属性
最近在做DHTMLX框架替换,新框架dhx的grid是不能选中内容复制的 虽然相对来说是安全些的,但是客户体验度一定会大打折扣 网页上禁止复制主要靠JavaScript来实现.<BODY onc ...
- 大麦盒子(domybox)无法进入系统解决方案!【简单几步】
大麦无法进入系统解决方案![简单几步]前提准备:电脑一台盒子控制台软件盒子开机并联网并且盒子和电脑处于同一个路由器下的网络! 前提准备:电脑一台盒子控制台软件盒子开机并联网并且盒子和电脑处于同一个路由 ...
- python——面向对象进阶
类的成员 类的成员可以分为三大类:字段.方法和属性 注:所有成员中,只有普通字段的内容保存对象中,即:根据此类创建了多少对象,在内存中就有多少个普通字段.而其他的成员,则都是保存在类中,即:无论对象的 ...
- stl_container容器和std_algorithm算法相同的函数
八.算法和容器中存在的功能相同的函数: 8.1.array: 8.1.1.fill. 1.在array中:void fill (const value_type& val); 2.在algor ...
- SQL Server中关于基数估计如何计算预估行数的一些探讨
关于SQL Server 2014中的基数估计,官方文档Optimizing Your Query Plans with the SQL Server 2014 Cardinality Estimat ...