今天在测试中无意中看到Tomcat 6的新特性Comet,使用Comet技术可以轻松实现一个Pushlet的功能,让我看了着实兴奋不已,而其官方网站还给出了一个Messenger的例子。
-
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 =
-
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 )
-
HttpServletRequest request = event. getHttpServletRequest ( );
-
HttpServletResponse response = event. getHttpServletResponse ( );
-
if (event. getEventType ( ) == CometEvent. EventType. BEGIN ) {
-
log ( "Begin for session: " + request. getSession ( true ). getId ( ) );
-
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 );
-
}
-
writer. println ( "</body></html>" );
-
event. close ( );
-
} else if (event. getEventType ( ) == CometEvent. EventType. READ ) {
-
byte [ ] buf = new byte [ 512 ];
-
do {
-
int n = is. read (buf ); //can throw an IOException
-
if (n > 0 ) {
-
+ " for session: " + request. getSession ( true ). getId ( ) );
-
} else if (n < 0 ) {
-
error (event, request, response );
-
return;
-
}
-
} while (is. available ( ) > 0 );
-
}
-
}
-
-
-
protected boolean running = true;
-
protected ArrayList<String> messages = new ArrayList<String> ( );
-
public MessageSender ( ) {
-
}
-
public void stop ( ) {
-
running = false;
-
}
-
-
/**
-
* Add message for sending.
-
*/
-
synchronized (messages ) {
-
messages. add ( "[" + user + "]: " + message );
-
messages. notify ( );
-
}
-
}
-
-
public void run ( ) {
-
-
while (running ) {
-
-
if (messages. size ( ) == 0 ) {
-
try {
-
synchronized (messages ) {
-
messages. wait ( );
-
}
-
// Ignore
-
}
-
}
-
-
synchronized (connections ) {
-
synchronized (messages ) {
-
messages. clear ( );
-
}
-
// Send any pending message on all the open connections
-
for ( int i = 0; i < connections. size ( ); i++ ) {
-
try {
-
for ( int j = 0; j < pendingMessages. length; j++ ) {
-
writer. println (pendingMessages [j ] + "<br>" );
-
}
-
writer. flush ( );
-
log ( "IOExeption sending message", e );
-
}
-
}
-
}
-
-
}
-
-
}
-
-
}
-
-
}