`
bethel
  • 浏览: 23181 次
  • 性别: Icon_minigender_2
  • 来自: 杭州
社区版块
存档分类
最新评论

Tomcat 6 AIO支持Comet的示例

阅读更多

 源地址链接:http://tomcat.apache.org/tomcat-6.0-doc/aio.html 

 

Tomcat 6 AIO支持Comet的sample代码:

 

public class ChatServlet
    extends HttpServlet implements CometProcessor {

    protected ArrayList<HttpServletResponse> connections = 
        new ArrayList<HttpServletResponse>();
    protected MessageSender messageSender = null;
    
    public void init() throws ServletException {
        messageSender = new MessageSender();
        Thread messageSenderThread = 
            new Thread(messageSender, "MessageSender[" + getServletContext().getContextPath() + "]");
        messageSenderThread.setDaemon(true);
        messageSenderThread.start();
    }

    public void destroy() {
        connections.clear();
        messageSender.stop();
        messageSender = null;
    }

    /**
     * Process the given Comet event.
     * 
     * @param event The Comet event that will be processed
     * @throws IOException
     * @throws ServletException
     */
    public void event(CometEvent event)
        throws IOException, ServletException {
        HttpServletRequest request = event.getHttpServletRequest();
        HttpServletResponse response = event.getHttpServletResponse();
        if (event.getEventType() == CometEvent.EventType.BEGIN) {
            log("Begin for session: " + request.getSession(true).getId());
            PrintWriter writer = response.getWriter();
            writer.println("<!doctype html public \"-//w3c//dtd html 4.0 transitional//en\">");
            writer.println("<head><title>JSP Chat</title></head><body bgcolor=\"#FFFFFF\">");
            writer.flush();
            synchronized(connections) {
                connections.add(response);
            }
        } else if (event.getEventType() == CometEvent.EventType.ERROR) {
            log("Error for session: " + request.getSession(true).getId());
            synchronized(connections) {
                connections.remove(response);
            }
            event.close();
        } else if (event.getEventType() == CometEvent.EventType.END) {
            log("End for session: " + request.getSession(true).getId());
            synchronized(connections) {
                connections.remove(response);
            }
            PrintWriter writer = response.getWriter();
            writer.println("</body></html>");
            event.close();
        } else if (event.getEventType() == CometEvent.EventType.READ) {
            InputStream is = request.getInputStream();
            byte[] buf = new byte[512];
            do {
                int n = is.read(buf); //can throw an IOException
                if (n > 0) {
                    log("Read " + n + " bytes: " + new String(buf, 0, n) 
                            + " for session: " + request.getSession(true).getId());
                } else if (n < 0) {
                    error(event, request, response);
                    return;
                }
            } while (is.available() > 0);
        }
    }

    public class MessageSender implements Runnable {

        protected boolean running = true;
        protected ArrayList<String> messages = new ArrayList<String>();
        
        public MessageSender() {
        }
        
        public void stop() {
            running = false;
        }

        /**
         * Add message for sending.
         */
        public void send(String user, String message) {
            synchronized (messages) {
                messages.add("[" + user + "]: " + message);
                messages.notify();
            }
        }

        public void run() {

            while (running) {

                if (messages.size() == 0) {
                    try {
                        synchronized (messages) {
                            messages.wait();
                        }
                    } catch (InterruptedException e) {
                        // Ignore
                    }
                }

                synchronized (connections) {
                    String[] pendingMessages = null;
                    synchronized (messages) {
                        pendingMessages = messages.toArray(new String[0]);
                        messages.clear();
                    }
                    // Send any pending message on all the open connections
                    for (int i = 0; i < connections.size(); i++) {
                        try {
                            PrintWriter writer = connections.get(i).getWriter();
                            for (int j = 0; j < pendingMessages.length; j++) {
                                writer.println(pendingMessages[j] + "<br>");
                            }
                            writer.flush();
                        } catch (IOException e) {
                            log("IOExeption sending message", e);
                        }
                    }
                }

            }

        }

    }

}
  

 

    需要写另一个方法来调用send(),传入message,通知messageSender线程来发送消息。

 

分享到:
评论

相关推荐

    艾肯Aio6声卡驱动_v1.37.5_兼容windows全系统

    艾肯Aio6声卡驱动_v1.37.5是专为艾肯(URC)公司的Aio6声卡设计的一款驱动程序,版本号为1.37.5,适用于Windows全系统,包括Windows 10。这款驱动程序的核心功能在于确保声卡在各种Windows操作系统上能够正常运行,...

    读书笔记:java网络编程BIONIO, AIO 源码示例.zip

    读书笔记:java网络编程BIONIO, AIO 源码示例

    linux_aio.zip_LINUX下开启AIO_aio glibc_aio 两种方式_linux aio_linux_aio

    Linux内核本身也支持AIO,它提供了`io_setup`、`io_submit`、`io_getevents`等系统调用来实现异步I/O。这种方式需要更底层的编程,但可以避免glibc层的额外开销,可能更适合性能敏感的应用。虽然本压缩包未直接包含...

    Tomcat面试题 14道.pdf

    aio 是 JDK 7 开始支持的异步非阻塞 IO。apr 是 Tomcat 将以 JNI 的形式调用 Apache HTTP 服务器的核心动态链接库来处理文件读取或网络传输操作。 三、Connector 配置 Connector 配置文件中有多个参数可以进行配置...

    aio.zip_aio_asynchronous io_linux aio

    Linux AIO并非内核原生支持的特性,而是通过libaio库来实现的。libaio提供了一组API,让开发者可以方便地使用异步I/O。这些API包括`lio_listio`、`io_setup`、`io_submit`、`io_getevents`等,它们分别用于设置I/O上...

    bio nio aio demo

    下面我们将深入探讨这三种I/O模型,并通过"bio nio aio demo"这个示例项目来理解它们的基础用法。 **1. BIO(阻塞I/O)** BIO是Java最早提供的I/O模型,它基于流(Stream)进行操作。在BIO模式下,每个连接都需要一个...

    AIO.rar_aio

    在这个场景中,"AIO"可能是一个缩写,代表着“Analog Input/Output”,暗示这个库支持模拟输入和输出功能。 AIO库的设计通常会包含以下关键知识点: 1. **模拟信号**:模拟信号是连续变化的电信号,与数字信号...

    icon艾肯aio6声卡驱动程序v1.35.20官方安装版

    艾肯icon aio6声卡驱动程序是一款可以有效解决艾肯aio6声卡出现的一些问题的驱动工具,艾肯icon aio6声卡是一款支持专业录音、编曲、K歌的usb外置声卡,这是艾肯官方最新发布的艾肯aio6声卡驱动,适用于XP/Win7/Win8...

    aio.rar_aio

    6. 设备驱动编程:展示如何编写支持AIO的设备驱动程序,与用户空间进行通信。 7. 示例和案例分析:通过实际的代码示例,展示如何在应用程序中使用AIO接口进行I/O操作。 8. 性能优化:探讨如何调整参数和配置,以获得...

    CISSP AIO4与AIO5的区别

    例如,AIO5可能反映了2018年CISSP认证领域的重大改革,将原本的8个知识领域调整为6个新的大领域,包括安全与风险管理、资产安全、网络安全、身份与访问管理、安全工程和信息安全治理与合规性。 3. **考试大纲**:...

    艾肯aio6 USB外置声卡驱动 v1.35.20 官方最新版

    iCON艾肯aio 6 USB外置声卡驱动1.35.20版For WinXP-32/WinXP-64/Win7-32/Win7-64/Win8-32/Win8-64(2014年11月19日发布)艾肯Aio 6不但支持专业的录音、编曲这些专业的音乐工作,并且支持网络K歌,他专业的话放,...

    科荣AIO管理系统V7版-用户手册

    AIO代表“所有合一”,意味着系统具备广泛的功能,如资源管理、项目协作、数据处理、报表分析等,以支持企业的全面运营。 二、安装与配置 在开始使用前,用户需要了解安装和配置的步骤。手册将指导用户如何下载安装...

    iFRPFILE AIO v2.8.6.zip

    iFRPFILE AIO v2.8.6.zip

    Java AIO 实例(转)

    下面是一个简单的AIO服务器端示例: ```java AsynchronousServerSocketChannel serverChannel = AsynchronousServerSocketChannel.open(); serverChannel.bind(new InetSocketAddress(8080)); serverChannel....

    aio方式socket文件传输--改进

    在实际应用中,Python的`asyncio`库提供了一套完善的aio支持。它包含了`create_connection`和`start_server`等函数,可以方便地创建异步socket连接和服务器。在文件传输过程中,可以使用`asyncio.StreamReader`和`...

    FRPFILE AIO v2.8.4.rar

    《FRPFILE AIO v2.8.4:解锁与绕过iOS系统FRP的全方位指南》 FRPFILE AIO v2.8.4是一款针对iOS设备的免费解锁工具,全称为“Factory Reset Protection FILE All in One”。该工具旨在帮助用户解决iOS设备的Factory ...

    Tomcat面试专题及答案.pdf

    - **AIO(异步非阻塞I/O)**:从JDK7开始支持,是一种新的I/O模型,适用于需要处理大量并发连接的应用。 - **APR(Apache Portable Runtime)**:这是一个第三方库,使用JNI(Java Native Interface)调用本地系统...

    MAS_AIO_v2.2.cmd.rar

    【标题】"MAS_AIO_v2.2.cmd.rar" 是一个压缩文件,它包含了一个名为 "MAS_AIO_v2.2.cmd" 的命令行脚本。这个文件很可能是一个集成安装包或者自动化工具的版本2.2,特别是针对MAS(可能是“Multi-Application Suite”...

Global site tag (gtag.js) - Google Analytics