Tomcat comet 服務器推技術介紹

jopen 12年前發布 | 86K 次閱讀 Tomcat 應用服務器

Tomcat已經實現了自己的comet方式,并且提供了一個例子。這樣網上的例子很多,我精簡了些。

MessageSender.java

package me.comet;

import java.io.IOException; import java.io.OutputStream; import java.util.Date;

import javax.servlet.ServletResponse;

public class MessageSender extends Thread {

private ServletResponse connection;

public MessageSender(ServletResponse connection) {
    this.connection = connection;
}

public void run() {
    try {
        while (true) {
            if (connection == null) {
                synchronized (this) {
                    wait();
                }
            }

            OutputStream out = connection.getOutputStream();
            out.write(getString().getBytes());
            out.flush();
            connection.flushBuffer();

            System.out.print(getString());

            Thread.sleep(1000);
        }
    } catch (IOException e) {
        e.printStackTrace();
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
}

@SuppressWarnings("deprecation")
private String getString() {
    return Thread.currentThread()+" CurrentTime "+new Date().toLocaleString() + "\n";
}

}</pre>

TimeServlet.java

package me.comet;

import java.io.IOException;

import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse;

import org.apache.catalina.CometEvent; import org.apache.catalina.CometProcessor;

public class TimeServlet extends HttpServlet implements CometProcessor { private static final long serialVersionUID = 1L; private static final Integer TIMEOUT = 10 * 1000;

private MessageSender sender = null;

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());
        request.setAttribute("org.apache.tomcat.comet.timeout", TIMEOUT);

        sender = new MessageSender(response);
        sender.start();

    } else if (event.getEventType() == CometEvent.EventType.ERROR) {
        log("Error for session: " + request.getSession(true).getId());
        event.close();
    } else if (event.getEventType() == CometEvent.EventType.END) {
        log("End for session: " + request.getSession(true).getId());
        event.close();
    } else if (event.getEventType() == CometEvent.EventType.READ) {
        throw new UnsupportedOperationException("This servlet does not accept data");
    }
}

@Override
public void destroy() {
    sender.interrupt();
    sender = null;
}

}</pre>

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee&quot;
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance&quot;
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
    http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"&gt;

<welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
</welcome-file-list>

<servlet>
    <servlet-name>TimeServlet</servlet-name>

    <servlet-class>me.comet.TimeServlet</servlet-class>
</servlet>

<servlet-mapping>
    <servlet-name>TimeServlet</servlet-name>

    <url-pattern>/time</url-pattern>
</servlet-mapping>

</web-app></pre>

test.jsp

<%@page contentType="text/html" pageEncoding="UTF-8"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"&gt; <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Comet Weather</title> </head>

<body>
    <label>記錄</label>
    <br/>
    <iframe src="http://localhost:8080/comet/time"
        width="60%" height="300" frameborder="1"></iframe>
</body>

</html></pre>

更改 tomcat/conf/server.xml

<Connector port="8080" protocol="org.apache.coyote.http11.Http11NioProtocol"  connectionTimeout="20000" redirectPort="8443" />

更改 tomcat/conf/context.xml

<Context>
    <Loader delegate="true" />

    <WatchedResource>WEB-INF/web.xml</WatchedResource>

</Context></pre>

jar包

添加tomcat/lib/catalina.jar

測試地址:http://localhost:8080/comet/test.jsp

來自:http://zkeshun.iteye.com/blog/1391922

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!