昨天我们已经能够确定浏览器的请求能够被我们自己编写的服务类所接收并且我们服务类响应的数据也能够正常发送到浏览器客户端,那么我们今天要解决的问题就是让我们的数据能够被浏览器识别并解析。

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容器(二)的更多相关文章

  1. 编写自己的一个简单的web容器(一)

    在之前的博客中我更大家说过Http协议是对tcp协议的封装,其底层还是使用tcp协议来进行数据传出的,浏览器实际上就是一个Socket客户端,今天呢我们就开始着手利用ServerSocket来编写一个 ...

  2. Tomcat详解系列(1) - 如何设计一个简单的web容器

    Tomcat - 如何设计一个简单的web容器 在学习Tomcat前,很多人先入为主的对它的认知是巨复杂的:所以第一步,在学习它之前,要打破这种观念,我们通过学习如何设计一个最基本的web容器来看它需 ...

  3. 一个简单的web服务器例子

    一个简单的web容器小例子,功能十分简单,只能访问静态资源,对于新手来说还是有一定的意义.主要分三个类 1.server类:主要功能开启socketServer,阻塞server,接收socket访问 ...

  4. 使用Java编写一个简单的Web的监控系统cpu利用率,cpu温度,总内存大小

    原文:http://www.jb51.net/article/75002.htm 这篇文章主要介绍了使用Java编写一个简单的Web的监控系统的例子,并且将重要信息转为XML通过网页前端显示,非常之实 ...

  5. 编写一个简单的Web Server

    编写一个简单的Web Server其实是轻而易举的.如果我们只是想托管一些HTML页面,我们可以这么实现: 在VS2013中创建一个C# 控制台程序 编写一个字符串扩展方法类,主要用于在URL中截取文 ...

  6. Docker容器技术-创建一个简单的Web应用

    一.创建一个简单的Web应用 1.identicon 基于某个值而自动产生的图像,这个值是IP地址或用户名的散列值. 用途: 通过计算用户名或IP地址的散列值,在网站上提供用于识别用户的图像,以及自动 ...

  7. 使用Servlet和JSP实现一个简单的Web聊天室系统

    1 问题描述                                                利用Java EE相关技术实现一个简单的Web聊天室系统,具体要求如下. (1)编写一个登录 ...

  8. Symfony2之创建一个简单的web应用

    Symfony2——创建bundle       bundle就像插件或者一个功能齐全的应用,我们在应用层上开发的应用的所有代码,包括:PHP文件.配置文件.图片.css文件.js文件等都会包含在bu ...

  9. Tomcat剖析(一):一个简单的Web服务器

    Tomcat剖析(一):一个简单的Web服务器 1. Tomcat剖析(一):一个简单的Web服务器 2. Tomcat剖析(二):一个简单的Servlet服务器 3. Tomcat剖析(三):连接器 ...

随机推荐

  1. 机器学习:Python实现单层Rosenblatt感知器

    如果对Rosenblatt感知器不了解,可以先查看下相关定义,然后对照下面的代码来理解. 代码中详细解释了各步骤的含义,有些涉及到了数学公式的解释. 这篇文章是以理解Rosenblatt感知器的原理为 ...

  2. 性能测试分享: Jmeter的源码分析main函数参数

    性能测试分享: Jmeter的源码分析main函数参数   poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.如果对课程感兴趣,请大 ...

  3. SVN将一台服务器上的代码迁移到另一台服务器上

    由于我们出差,需要把svn服务器上的代码同步到我电脑上,自己各种百度折腾了快一天才弄好,下面来分享下我的具体思路和操作步骤.有2种方式:第一种方式:直接将本地自己dowm下来的代码导入到本地svn服务 ...

  4. Web性能优化工具WebPageTest(一)——总览与配置

    网站性能优化工具大致分为两类:综合类和RUM类(实时监控用户类),WebPageTest属于综合类. WebPageTest通过布置一些特定的场景进行测试,例如不同的网速.浏览器.位置等. 测试完成后 ...

  5. Win7+CentOS双系统(一)

    注意:1.由于涉及到对硬盘操作,请妥善备份数据,避免损失. 2.为了达到每个步骤都有图片覆盖,我使用了虚拟机来进行测试,不过请大家放心,我已经在自己的物理机上成功实现了. 3.我的步骤是绝对正确和缺一 ...

  6. js 模板引擎

    template = document.querySelector('#template').innerHTML, result = document.querySelector('.result') ...

  7. 用MPLAB IDE编程时,软件总是弹出一个窗口提示: “the extended cpu mode configuration bit is enabled,but the program that was loaded was not built using extended cpu instructions. therefore,your code may not work properly

    用MPLAB IDE编程时,软件总是弹出一个窗口提示:"the extended cpu mode configuration bit is enabled,but the program ...

  8. 关于解决配置Tomact过程中出现的相关问题

    最近在学习JavaWeb, 但是在第一步的时候就出现问题了, 什么问题呢, 就是关于Tomact的配置. 下面我就详细说明一下我配置过程中出现的问题以及怎么解决的,  希望对大家能有所帮助. 首先,我 ...

  9. Xcode新建python项目

    1.找到电脑上安装Python的路径.OSX系统默认安装了python,默认的路径为/usr/bin/python.不确定的情况下,也可以打开命令行,用 whereis python 命令查看 2.打 ...

  10. C#处理JSON 数据

    网络中数据传输经常是xml或者json,现在做的一个项目之前调其他系统接口都是返回的xml格式,刚刚遇到一个返回json格式数据的接口,通过例子由易到难总结一下处理过程,希望能帮到和我一样开始不会的朋 ...