zoukankan      html  css  js  c++  java
  • 编写自己的一个简单的web容器(一)

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

    1.ServerSocket能正常接收到浏览器的请求信息

      我们创建一个ServerSocket 

     1 package cn.wz.net.demo;
     2 
     3 import java.io.DataInputStream;
     4 import java.io.IOException;
     5 import java.net.ServerSocket;
     6 import java.net.Socket;
     7 
     8 /**
     9  * Created by WangZhe on 2017/5/17.
    10  */
    11 public class SocketServer {
    12     public static void main(String[] args) throws IOException {
    13         ServerSocket server = new ServerSocket(7777);
    14         Socket accept = server.accept();
    15         DataInputStream dis = new DataInputStream(accept.getInputStream());
    16         byte[] data=new byte[20480];
    17         dis.read(data);
    18         String requserInfo=new String(data);
    19         System.out.println(requserInfo);
    20     }
    21 }
    demo

      使用浏览器去请求我们创建的ServerSocket

    查看控制台结果

     通过我们上面的测试基本已经确定ServerSocket能够正常接收到浏览器的请求信息。

    2.ServerSocket能够正常向浏览器响应数据

    我们在通过ServerSocket的OutputStream来想浏览器相应数据

     1 package cn.wz.net.demo;
     2 
     3 import java.io.DataInputStream;
     4 import java.io.DataOutputStream;
     5 import java.io.IOException;
     6 import java.net.ServerSocket;
     7 import java.net.Socket;
     8 
     9 /**
    10  * Created by WangZhe on 2017/5/17.
    11  */
    12 public class SocketServer {
    13     public static void main(String[] args) throws IOException {
    14         ServerSocket server = new ServerSocket(7777);
    15         Socket accept = server.accept();
    16         DataInputStream dis = new DataInputStream(accept.getInputStream());
    17         byte[] data=new byte[20480];
    18         dis.read(data);
    19         String requserInfo=new String(data);
    20         System.out.println(requserInfo);
    21         DataOutputStream dos = new DataOutputStream(accept.getOutputStream());
    22         dos.writeUTF("<html>");
    23         dos.writeUTF("  <head><title>测试</title></head>");
    24         dos.writeUTF("  <body><div>测试页面</div></body>");
    25         dos.writeUTF("</html>");
    26         dos.flush();
    27         dos.close();
    28         dis.close();
    29         accept.close();
    30         server.close();
    31     }
    32 }
    demo

    然后我们查看浏览器是否能够解析并显示我们的数据

    我们可以看到浏览器并没有解析出我们想要的数据,并且报了一个响应无效的错误。这时虽然并没有达到我们预期的效果,但这对我们来说依然是一个比较好的消息,因为我们可以确定我们的数据能够发送到浏览器端了,只是浏览器不能解析而已,我们只要能够解决浏览器解析数据的问题那么我们编写自己的web容器的计划就还是可行的,那如何解决其解析问题呢?

    我们知道浏览器的请求是基于Http协议(底层使用tcp协议)的而我们上面的测试中始终都是tcp的连接协议,而没有涉及到http协议,在我之前的博客中也提到过http协议的主要作用是控制响应数据的格式。如果我们响应给浏览器的数据能够符合http协议规定的格式,那浏览器就能够解析我们的数据了!

  • 相关阅读:
    transform.forward和vector3.forward
    游戏开发数值公式
    类的大小
    c#扩展方法
    C# 线程本地存储 调用上下文 逻辑调用上下文
    DbCommandInterceptor抓取EF执行时的SQL语句
    C# 关键字const与readonly的区别
    Swagger(webapi自动生成接口说明文档)
    log4net配置
    JavaScript代码优化指南
  • 原文地址:https://www.cnblogs.com/wangzheand/p/6868408.html
Copyright © 2011-2022 走看看