WEB開発サーバプッシュ技術-tomcat 7のwebsocket

5900 ワード

tomcat 7から0.26以降websocketのサポートを開始し、tomcat 7を使用することをお勧めします.0.30で、期間バージョンのインタフェースにいくつかの変更があります.chromeはデフォルトでwebsocketをサポートします.他のブラウザは、セキュリティ上の理由でデフォルトでオフになっている可能性があります.
package com.panguso.phl.servlet;

import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.CharBuffer;
import java.util.logging.Logger;

import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServletRequest;

import org.apache.catalina.websocket.MessageInbound;
import org.apache.catalina.websocket.StreamInbound;
import org.apache.catalina.websocket.WebSocketServlet;
import org.apache.catalina.websocket.WsOutbound;

/**
 * 
 * @author piaohailin
 * 2012-09-08
 *
 */
@WebServlet(urlPatterns = "/echo.ws")
//   WebSocket Servlet     WebSocketServlet,    7.0.27    
public class EchoServlet extends WebSocketServlet {
    // Log
    private Logger logger = Logger.getLogger(EchoServlet.class.getName());

    @Override
    //  7.0.27   ,Tomcat   createWebSocketInbound     ,     HttpServletRequest  
    //         request             
    protected StreamInbound createWebSocketInbound(String subProtocol,
                                                   HttpServletRequest request) {
        // Log
        //        logger.setLevel(java.util.logging.Level.ALL);
        logger.info("request ws servlet");

        //          StreamInbound  ,          MessageInbound
        //               (  onClose onOpen     )
        return new MessageInbound() {
            // WebSocket    ,  status    org.apache.catalina.websocket.Constants        ,            Tomcat   
            @Override
            protected void onClose(int status) {
                // Log
                logger.info("Web Socket Closed: " + status);
            }

            // WebSocket    ,    ,WsOutbound          
            @Override
            protected void onOpen(WsOutbound outbound) {
                // Log
                logger.info("Web Socket Open!");
            }

            //           ,                 ,js WebSocket       send      
            @Override
            protected void onBinaryMessage(ByteBuffer buffer) throws IOException {
                // Log
                logger.info("Binary Message Receive: " + buffer.remaining());
                // Nothing
            }

            //          
            @Override
            protected void onTextMessage(CharBuffer buffer) throws IOException {
                // Log
                logger.info("Text Message Receive: " + buffer.remaining());
                // getWsOutbound       WsOutbound,           ,      nio CharBuffer
                getWsOutbound().writeTextMessage(buffer);
                
                //          ,       , 3   1      
                //                for (int i = 0; i < 3; i++) {
                //                    try {
                //                        Thread.sleep(3000);
                //                    } catch (InterruptedException e) {
                //                        // TODO Auto-generated catch block
                //                        e.printStackTrace();
                //                    }
                //                    getWsOutbound().writeTextMessage(CharBuffer.wrap(String.valueOf(i).subSequence(0, 1)));
                //                }

            }
        };
    }
}

index.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
<script type="text/javascript">
	var ws = null;

	function startServer() {
		//   WebSocket,     ws,        WebSocketServlet 
		var url = "ws://127.0.0.1:8080/echo.ws";
		//   WebSocket  ,    MozWebSocket Firefox   
		if ('WebSocket' in window) {
			ws = new WebSocket(url);
		} else if ('MozWebSocket' in window) {
			ws = new MozWebSocket(url);
		} else {
			alert('Unsupported.');
			return;
		}

		// WebSocket    ,       
		//     ,   new WebSocket          ,     onopen      ,          
		ws.onopen = function() {
			alert('Opened!');
		};

		//             , event.data      
		ws.onmessage = function(event) {
			alert('Receive message: ' + event.data);
		};

		//   WebSocket   
		ws.onclose = function() {
			alert('Closed!');
		};
	}

	function sendMyMessage() {
		var textMessage = document.getElementById('textMessage').value;

		if (ws != null && textMessage != '') {
			//   WebSocket             
			ws.send(textMessage);
		}
	}
</script>
</head>
<body>
<body onload="startServer()">
<input type="text" id="textMessage" size="20" />
<input type="button" onclick="sendMyMessage()" value="Send">
</body>
</html>