编写自己的一个简单的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协议规定的格式,那浏览器就能够解析我们的数据了!

转载于:https://www.cnblogs.com/wangzheand/p/6868408.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
对于将多个容器打包成一个镜像的需求,可以使用 Docker Compose 来实现。Docker Compose 是一个用于定义和运行多容器 Docker 应用程序的工具。以下是一个简单的示例: 1. 首先,在项目根目录下创建一个名为 `docker-compose.yml` 的文件。 2. 在 `docker-compose.yml` 文件中,定义每个容器的配置。例如,假设你有两个容器:一个是 Web 服务器容器,另一个是数据库容器。你可以使用以下配置示例: ```yaml version: '3' services: web: build: context: . dockerfile: Dockerfile.web ports: - 80:80 db: build: context: . dockerfile: Dockerfile.db ports: - 3306:3306 ``` 以上配置定义了两个服务:web 和 db。每个服务都有自己的构建配置和端口映射。 3. 在项目根目录下创建两个 Dockerfile,分别命名为 `Dockerfile.web` 和 `Dockerfile.db`。分别编写这两个容器的构建配置。 4. 在每个 Dockerfile 中,你可以按照正常的 Dockerfile 语法来配置容器的构建过程。例如,可以指定基础镜像、安装依赖、复制文件等等。 5. 完成以上步骤后,运行以下命令来构建和启动多个容器: ```bash docker-compose up ``` 这将根据 `docker-compose.yml` 文件中的配置构建并启动所有定义的容器。 通过 Docker Compose,你可以轻松地管理和打包多个容器,并将它们作为一个整体进行部署和运行。希望以上信息对你有所帮助!如有任何疑问,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值