Tomcat 7に基づく.0.29 WebSocket実装
先月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で変更されているはずです)
そしてws.html上のJavaScriptスクリプトは、これは相変わらずです.
Tomcat 7.0.29で実行に成功しました.
今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で実行に成功しました.