java实现一个最简单的tomcat服务

Posted cao_xiaobo

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java实现一个最简单的tomcat服务相关的知识,希望对你有一定的参考价值。

 

1.如何启动?

main方法是程序的入口,tomcat也不例外,查看tomcat源码,发现main是在Bootstrap 类中的;

 

2.如何建立连接?

 

要通讯,必须要建议socket连接,我们需要使用哪种socket,是根据它使用的哪种协议进行判断的。tcp协议or udp协议?http协议本身属于tcp协议,因此我们选择的socket是基本tcp协议的socket。在tomcat中,StandardServer 中 await() 方法具体实现了 socket连接;

 

3.使用哪种io模式?

  • BIO方式适用于连接数目比较小且固定的架构,这种方式对服务器资源要求比较高;
  • NIO方式适用于连接数目多且连接比较短(轻操作)的架构,比如聊天服务器;
  • AIO方式使用于连接数目多且连接比较长(重操作)的架构,比如相册服务器
  • tomcat 使用了io,bio、nio、apr三种io模式,它们不同的应用各自发挥其优点。这里通过bio简单实现一个tomcat服务。

代码示例:

public class Server {

    public static void main(String[] args) throws IOException {
        new Server().start();
    }

    public void start() throws IOException {
        ServerSocket serverSocket = new ServerSocket(8888);
        Socket socket = null;
        System.out.println("启动web服务");
        while (true) {
            socket = serverSocket.accept();
            Thread thread = new Thread(new HttpServerThread(socket));
            thread.start();
        }
    }

    // 内部类
    private class HttpServerThread implements Runnable {
        Socket socket = null;

        HttpServerThread(Socket socket) {
            this.socket = socket;
        }

        @Override
        public void run() {
            InputStream is = null;
            OutputStream os = null;
            BufferedReader br = null;
            try {
                is = this.socket.getInputStream();
                os = this.socket.getOutputStream();
                
                // 页面的请求
                br = new BufferedReader(new InputStreamReader(is));
                String line = br.readLine();
                int i = 0;
                while (null != line && br.ready()) {
                    line = br.readLine();
                    System.out.println("第" + i + "行信息:" + line);
                    i++;
                }

                // 页面的响应
                String reply = "HTTP/1.1\n";             // 必须添加的响应头
                reply += "Content-type:text/html\n\n";        // 必须添加的响应头
                reply += "服务器返回的消息";
                os.write(reply.getBytes());
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                try {
                    os.close();
                    is.close();
                    socket.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

 

在浏览器上输入:http://localhost:8888/

控制台输出:

第0行信息:Host: localhost:8888
第1行信息:Connection: keep-alive
第2行信息:Cache-Control: max-age=0
第3行信息:User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36
第4行信息:Upgrade-Insecure-Requests: 1
第6行信息:Accept-Encoding: gzip, deflate, br
第5行信息:Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
第8行信息:Cookie: JSESSIONID=F373E4FD1D4E6E57AB618563B796B909;
第7行信息:Accept-Language: zh-CN,zh;q=0.9
第9行信息:

控制台上的输出包含http请求头信息,socket接收的流格式为字符类型,每一行都代表一种类型的信息,因此解析时需要逐行解析。之前使用BufferedReader的readLine( )方法,但是此方法是阻塞线程的,如果读取不到,会一直处理等待状态,因此配合ready( )方法一起使用。

 

以上是关于java实现一个最简单的tomcat服务的主要内容,如果未能解决你的问题,请参考以下文章

Java REST Api(在 tomcat 上运行)- 在客户端和服务器之间获得实时同步的最简单方法

编辑一个最简单的Tomcat服务器

Java中Socket 实现最简单的客户端与服务端通信

Java中Socket 实现最简单的客户端与服务端通信

Tomcat根据JSP生成Servlet机制解析

在Tomcat的安装目录下conf目录下的server.xml文件中增加一个xml代码片段,该代码片段中每个属性的含义与用途