Tomcat 7に基づく.0.29 WebSocket実装

4384 ワード

先月HTML 5のWebSocketを見たときTomcat 7.0.27にWebSocketと書いてタイムアウトの問題に遭遇し、その時Tomcatのソースコードをデバッグし、下層で使用されているSocketがリードタイムアウトを設定していることを確認し、放っておくしかなく、Nodeを使用した.jsはテストをしました.
今Tomcatバージョンは7.0.29に変えて、Change Logを見て、タイムアウトの問題は7.0.28の上で解決したようで、再び本の上のecho.wsは再びTomcatバージョンに変更され、機能は簡単で、ホームページに何のテキストを送って、サーバーは何のテキストを返します.
53074: Switch to an infinite socket timeout by default for WebSocket connections. (markt)
サーバ側プログラムで使用する鍵はWebSocketServiceletとMessageInboundです.WebSocketServiceletのcreateWebSocketInboundメソッドは7.0.27バージョンに対してHttpServiceletRequestパラメータが1つ増えています(ドキュメントでは7.0.2で変更されているはずです)
package fox.web.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;

@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.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);
			}
		};
	}
}

そしてws.html上のJavaScriptスクリプトは、これは相変わらずです.
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html> 
	<head> 
		<title>Web Socket Demo</title> 
		<script type="text/javascript"> 
		var ws = null; 

		function startServer() {
			//   WebSocket,     ws,        WebSocketServlet 
			var url = "ws://127.0.0.1:8080/j2ee6/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 onload="startServer()"> 
		<input type="text" id="textMessage" size="20" />
		<input type="button" onclick="sendMyMessage()" value="Send">
	</body> 
</html> 

Tomcat 7.0.29で実行に成功しました.