栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 系统运维 > 运维 > Linux

【手写Tomcat】2.实现游览器和服务器的简单通信

Linux 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

【手写Tomcat】2.实现游览器和服务器的简单通信

        我们现在要实现一个最基本的功能,使游览器能够访问到我们的服务器。

        这次我们实现的功能比较简单,我们的自己写的代码像Tomcat那样在8080端口进行监听,游览器访问时,我们可以输出http请求的信息,并且以http响应的方式返回一句话。

流程大致为:

    使用网络编程在8080端口进行循环监听当游览器访问时建立连接利用I/O编程输出http请求的信息设置http响应通过I/O编程向游览器回送数据关闭流,断开连接。

代码实现

        首先先创建一个ServerScoket在8080端口进行循环监听,下面仅展示核心代码

//得到ServerSocket,在8080端口进行监听
ServerSocket serverSocket = new ServerSocket(8080);
while (!serverSocket.isClosed()) {
}

        等待访问,然后进行连接

//等待连接
Socket socket = serverSocket.accept();

        得到输入流,并且转成字符输入流进行按行读取展示

//得到输入流
InputStream inputStream = socket.getInputStream();
//将字节输入流转为字符输入流。并将编码设置为utf-8
BufferedReader bufferedReader = new BufferedReader(
           new InputStreamReader(inputStream, StandardCharsets.UTF_8));
String line = null;
//循环读取
System.out.println("3:开始读取内容");
while ((line = bufferedReader.readLine()) != null) {
    //如果为空就结束读取
    if (line.length() == 0) break;
    System.out.println(line);
}

        设置响应头,响应体,然后获取输出流进行返回

//得到输出流
OutputStream outputStream = socket.getOutputStream();
//设置响应头
String responseHead = "HTTP/1.1 200rn" +
           "Content-Type: text/html;charset=utf-8rnrn";
//设置响应体
String responseBody = "这是我自己写的Tomcat";
//http响应消息内容
String response = responseHead + responseBody;
//写回数据
outputStream.write(response.getBytes());

        最后关闭流,断开连接

//关闭流
outputStream.close();
inputStream.close();
socket.close();

        完整代码如下

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.nio.charset.StandardCharsets;

public class MyTomcat01 {

    public static void main(String[] args) {
        try {
            //得到ServerSocket,在8080端口进行监听
            ServerSocket serverSocket = new ServerSocket(8080);
            System.out.println("---------服务器启动成功----------");
            while (!serverSocket.isClosed()) {
                System.out.println("-------------------------------------------------");
                System.out.println("1:等待连接");
                //等待连接
                Socket socket = serverSocket.accept();
                System.out.println("2:连接成功");
                //得到输入流
                InputStream inputStream = socket.getInputStream();
                //将字节输入流转为字符输入流。并将编码设置为utf-8
                BufferedReader bufferedReader = new BufferedReader(
                        new InputStreamReader(inputStream, StandardCharsets.UTF_8));
                String line = null;
                //循环读取
                System.out.println("3:开始读取内容");
                while ((line = bufferedReader.readLine()) != null) {
                    //如果为空就结束读取
                    if (line.length() == 0) break;
                    System.out.println(line);
                }
                System.out.println("4:读取内容结束");
                //得到输出流
                OutputStream outputStream = socket.getOutputStream();
                //设置响应头
                String responseHead = "HTTP/1.1 200rn" +
                        "Content-Type: text/html;charset=utf-8rnrn";
                //设置响应体
                String responseBody = "这是我自己写的Tomcat";
                //http响应消息内容
                String response = responseHead + responseBody;
                //写回数据
                outputStream.write(response.getBytes());
                System.out.println("5:响应成功");
                //关闭流
                outputStream.close();
                inputStream.close();
                socket.close();
                System.out.println("6:本次连接结束,正常关闭socket");
                System.out.println("-------------------------------------------------n");
            }
        } catch (IOException e) {
            System.out.println("服务器启动失败");
        }
    }
}

测试

        我们运行程序后使用游览器(Firefox)访问localhost/8080,抓包进行查看,内容如下


        这是原始的http请求,我们再查看控制台输出的内容是不是和上面一样,控制台输出的如下


        发现是一样的,说明我们的代码请求部分没有问题了,接下来我们看一下页面的显示情况,以及抓包看一下响应的部分。

页面显示


 响应头


        发现页面和我们想象的一样,响应头也和我们设置的一样,到此,我们的游览器和服务器之间的基本通信就打通了,后面功能我们慢慢实现!!!

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/747213.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号