【手写Tomcat】2.实现游览器和服务器的简单通信
  TEZNKK3IfmPf 2023年11月12日 40 0

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

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

流程大致为:

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

代码实现

        首先先创建一个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 200\r\n" +
           "Content-Type: text/html;charset=utf-8\r\n\r\n";
//设置响应体
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 200\r\n" +
                        "Content-Type: text/html;charset=utf-8\r\n\r\n";
                //设置响应体
                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,抓包进行查看,内容如下

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


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

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


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

页面显示

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


 响应头

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


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

【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月12日 0

暂无评论

推荐阅读
  TEZNKK3IfmPf   2024年05月31日   29   0   0 服务器
  TEZNKK3IfmPf   2024年05月17日   41   0   0 linux服务器
  TEZNKK3IfmPf   2024年05月31日   48   0   0 linux服务器
  TEZNKK3IfmPf   2024年05月31日   28   0   0 linux服务器centos
  TEZNKK3IfmPf   2024年05月31日   42   0   0 服务器java
  TEZNKK3IfmPf   2024年05月31日   36   0   0 服务器http
TEZNKK3IfmPf