编写自己的一个简单的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剖析(三):连接器 ...
随机推荐
- 【C语言】两种方式实现冒泡排序算法
题目要求 编写一个C语言程序,实现基本的冒泡排序算法. 算法 冒泡排序,用一句话来总结: 一组数中,相邻的两个数进行比较.交换,将最大(小)数交换至尾(首)部,即完成了一次冒泡排序 要想对N个数字进行 ...
- 现代3D图形编程学习-你好,三角形(译)
你好,三角形 传统的入门教程在介绍编程语言的时候,通常从"Hello,World!"的程序开始.这样的程序拥有最简单的能够直接输出"Hello, World!" ...
- Android中那些有你不知道的事
在安卓开发中,总有那么一些看似简单,实则绊脚的难题,等你去探索,等你去解决,也许你已经遇见了解决了,也许你还没碰上,写下这篇总结,希望能帮助那行即将遇到的朋友,快速解决这些小问题! 一.activit ...
- 重写NSArray与NSDictionary的descriptionWithLocale方法
重写NSArray的descriptionWithLocale方法: NSArray+log.h #import <Foundation/Foundation.h> @interface ...
- 4日6日--Math的常用方法
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- BZOJ1857 传送带 (三分法求单峰函数极值)
第一次发BZOJ的题解,先从水题开始吧,好不容易找到一道水题,那就从这题开始吧. 1.题设部分{ 题目描述: 在一个2维平面上有两条传送带,每一条传送带可以看成是一条线段.两条传送带分别为线段AB和线 ...
- UVa/数组和字符串习题集
UVa-272. Description: TEX is a typesetting language developed by Donald Knuth. It takes source text ...
- 几个地图(高德、百度、Apple、Google)URL API
移动应用中,如何在自己的App中调起第三方的原生地图App,并显示相关的信息,如显示指定的一个坐标位置,显示一个起点到终点的路线查询,等等. 目前几个主要的地图商都提供了自己的App通过URL调用的形 ...
- Linux配置tomcat (centos配置java环境 tomcat配置篇 总结三)
♣下载安装tomcat7 ♣设置启动和关闭 ♣设置用户名和密码 ♣发布java web项目 声明:这篇教程是建立在前两篇教程的基础上的,所以,还没安装工具和jdk,可以先看这个系列的前面两篇(去到文末 ...
- css3 新属性
一 选择器1 兄弟选择器 0 以第一个选择器开始,往后找满足条件的兄弟节点 class~class() <-- lorem+数字 -tab --> 可以输出默认文字2 属性选择器 标签[a ...