美文网首页
监听、接收请求、处理

监听、接收请求、处理

作者: 追梦小蜗牛 | 来源:发表于2020-12-02 14:28 被阅读0次
pexels-agafonova-photo-5485967.jpg

介绍:

Tomcat中绑定、监听端口、注册到Poller、事件触发都在EndPoint组件里面处理。

结构图:

Endpoint.png

主要可以分析下NioEndpoint的代码,另外Nio2Endpoint和AprEndpoint用的频率不是很高。
使用了模板模式:AbstractEndpoint是一个抽象类,抽象方法如下:

    public abstract void bind() throws Exception;
    public abstract void unbind() throws Exception;
    public abstract void startInternal() throws Exception;
    public abstract void stopInternal() throws Exception;

流程简介:

NioEndpoint的startInternal方法,用来启动当前组件,创建Acceptor、Poller...


启动组件.png

绑定端口:

    @Override
    public void bind() throws Exception {
        initServerSocket();

        setStopLatch(new CountDownLatch(1));

        // Initialize SSL if needed
        initialiseSsl();

        selectorPool.open(getName());
    }

socket注册到poller,poller里面有selector变量...

        public void register(final NioChannel socket, final NioSocketWrapper socketWrapper) {
            socketWrapper.interestOps(SelectionKey.OP_READ);//this is what OP_REGISTER turns into.
            PollerEvent event = null;
            if (eventCache != null) {
                event = eventCache.pop();
            }
            if (event == null) {
                event = new PollerEvent(socket, OP_REGISTER);
            } else {
                event.reset(socket, OP_REGISTER);
            }
            addEvent(event);
        }

感知事件变化,Poller的run方法:

@Override
        public void run() {
            // Loop until destroy() is called
            while (true) {

                boolean hasEvents = false;

                try {
                    if (!close) {
                        hasEvents = events();
                        if (wakeupCounter.getAndSet(-1) > 0) {
                            // If we are here, means we have other stuff to do
                            // Do a non blocking select
                            keyCount = selector.selectNow();
                        } else {
                            keyCount = selector.select(selectorTimeout);
                        }
                        wakeupCounter.set(0);
                    }
                    if (close) {
                        events();
                        timeout(0, false);
                        try {
                            selector.close();
                        } catch (IOException ioe) {
                            log.error(sm.getString("endpoint.nio.selectorCloseFail"), ioe);
                        }
                        break;
                    }
                } catch (Throwable x) {
                    ExceptionUtils.handleThrowable(x);
                    log.error(sm.getString("endpoint.nio.selectorLoopError"), x);
                    continue;
                }
                // Either we timed out or we woke up, process events first
                if (keyCount == 0) {
                    hasEvents = (hasEvents | events());
                }

                Iterator<SelectionKey> iterator =
                    keyCount > 0 ? selector.selectedKeys().iterator() : null;
                // Walk through the collection of ready keys and dispatch
                // any active event.
                while (iterator != null && iterator.hasNext()) {
                    SelectionKey sk = iterator.next();
                    NioSocketWrapper socketWrapper = (NioSocketWrapper) sk.attachment();
                    // Attachment may be null if another thread has called
                    // cancelledKey()
                    if (socketWrapper == null) {
                        iterator.remove();
                    } else {
                        iterator.remove();
                        processKey(sk, socketWrapper);
                    }
                }

                // Process timeouts
                timeout(keyCount,hasEvents);
            }

            getStopLatch().countDown();
        }

总结:

不积跬步,无以至千里...

相关文章

  • 监听、接收请求、处理

    介绍: Tomcat中绑定、监听端口、注册到Poller、事件触发都在EndPoint组件里面处理。 结构图: 主...

  • kafka 请求处理与RPC(四)

    kafka server启动后,会监听一些端口,然后开始接收请求进行日常的工作。与请求处理相关的组件有 Socke...

  • go语言TCP编程入门

    服务端 服务端的处理流程 监听端口8888 接收客户端的tcp连接 创建gorountine,处理该链接的请求(通...

  • Web服务前篇 简单的http请求过程

    一次完整的http请求处理过程: (1) 建立或处理连接:接收请求或拒绝请求 (2) 接收请求: 接收来自于网络的...

  • HTTP原理

    (1)建立连接:接收或拒绝连接请求 (2)接收请求: 接收客户端请求报文中对某资源的一次请求的过程 (3)处理请求...

  • HTTP 之 一次完整的http请求处理过程

    http请求处理过程如下 .1、建立连接:接收或拒绝连接请求,通过三次握手建立 .2、接收请求:接收客户端请求报文...

  • MyCAT源码分析(三)请求处理流程

    本篇将按请求处理的流程来分析MyCAT NIO网络通信框架。从请求的接收开始:1、NIOAcceptor 接收请求...

  • httpd基础(1)

    httpd服务器请求处理过程: 1、建立连接:接收或拒绝连接请求2、接收请求:接收客户端请求报文中对某资源的一次请...

  • http常用状态码

    100~199:指示信息,表示请求已接收,继续处理200~299:请求成功,表示请求已被成功接收、理解、接受300...

  • 前端体系

    B/S架构 和 C/S架构 前端 页面加载 交互 后端 接收请求 处理请求 响应请求 MVC、链式处理、模板引擎 ...

网友评论

      本文标题:监听、接收请求、处理

      本文链接:https://www.haomeiwen.com/subject/lanywktx.html