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( )方法一起使用。

原文地址:https://www.cnblogs.com/caoxb/p/9326733.html

时间: 2025-01-13 03:17:20

java实现一个最简单的tomcat服务的相关文章

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

用Java编写编写一个最简单的Tomcat服务器,我们只是编写的Tomcat服务器没有比真正的Tomcat服务器强大,主要是来了解Tomcat服务器底层. import java.io.*; import java.net.*; public class MyTomcat { public static void main(String []args) throws Exception { ServerSocket ss = new ServerSocket(9999); System.out.

利用SpringCloud搭建一个最简单的微服务框架

http://blog.csdn.net/caicongyang/article/details/52974406 1.微服务 微服务主要包含服务注册,服务发现,服务路由,服务配置,服务熔断,服务降级等一系列的服务,而Spring Cloud为我们提供了个一整套的服务: 本例子为你提供了最简单的一个服务发现例子,包含服务注册发现spingCloudEurekaServer.服务配置中心spingCloudConfServer.以及一个app应用springCloudApp 2.服务注册与发现 s

【Java】一个最简单的事件总线实现

一个最简单的事件总线实现 MicroBus 使用 注册 class Receiver implements MicroBus.BusEventReceiver { public onCreate() { bus.register(this, String.class); } public onDestroy() { bus.unregister(this, String.class); } @Override public void onBusEvent(Object event) { if (

一个最简单的微服务架构

前言 微服务架构一般会有一个开放网关作为总入口,负责分发流量到实际的应用服务上.下面看图. 架构图 项目结构 这个架构分别由反向代理nginx,注册中心zookeeper,开放网关gateway,和两个服务goodservice,priceservice组件而成.为了方便测试,我把建了两个一样的gateway和goodservice.而common作为公共的二方包存在,也是为了简单起见,gateway和service引用同一个二方包. nginx nginx除了作为反向代理,也具有负载均衡的功能

自己模拟的一个简单的tomcat

servlet容器的职责 总的来说,一个全功能的servlet容器会为servlet的每个HTTP请求做下面的一些工作: 1,当第一次调用servlet的时候,加载该servlet类并调用servlet的init方法,只有一次, 2,对于每次请求,都要new出一个request请求和response相应实例, 3,调用servlet的service方法,同时传递ServletRequest和ServletResponse对象, 4,当servlet类被关闭的时候,调用servlet的destro

Vbs脚本定时判断及启动tomcat服务

说到tomcat服务,我们大家都会联系到apache,那apache和tomcat有什么区别呢,apache是web服务器(静态解析,如HTML),tomcat是java应用服务器(动态解析,如JSP.PHP)tomcat只是一个servlet(jsp也翻译成servlet)容器,可以认为是apache的扩展,但是可以独立于apache运行,两者从以下几点可以比较的: 1.两者都是apache组织开发的 .2.两者都有HTTP服务的功能 .3.两者都是开源免费的 .当然对于一个java开发人员来

Tomcat 服务应用

转自:http://wiki.jikexueyuan.com/project/tomcat/windows-service.html Tomcat8 是一个服务应用,能使 Tomcat 8 以 Windows 服务的形式运行. Tomcat 监控应用 Tomcat8w 是一个监控与配置 Tomcat 服务的 GUI 应用. 可用的命令行选项为:                                                  //ES// 编辑服务配置 这是默认操作.如果没有提供

WCF--建立简单的WCF服务

在VS2010里建立一个最简单的WCF服务,基本流程如下: 一:新建WCF应用 首先,新建一个WCF服务的应用,如下图所示 建立完成之后,VS将自动生成一个最简单的WCF工程,在这个应用中,包含了最基本Contract.Service. 工程如下: 不需要编辑任何文件,直接编译生成,得到一个WcfService1.dll文件 二.WCF应用中的契约(Contract) 在生成的WCF工程中,IService1.cs中为Contract(本例中契约和服务放在同一个工程下了,实际上也可以分为两个工程

一个简单的通讯服务框架(大家发表意见一起研究)JAVA版本

最近研究下java语言,根据一般使用的情况,写了个连接通讯服务的框架: 框架结构 C-Manager-S; 把所有通讯内容抽取成三个方法接口:GetData,SetData,带返还的Get; 所有数据都处理为byte[];客户端与服务端和管理器以及服务端有多重处理模式 管理信息: 1.不需要中心管理器:服务端启动时向客户端广播自己绑定的地址:接收数据:客户端使用时广播一次请求,向所有服务端获取服务信息: 2.管理中心:客户端向管理器请求服务信息:服务端向管理器注册地址:根据需要,可以把客户端传递