WebSocketでEchoServerをつくる(Java EE 7編)
Java EE 7でWebSocketに対応するらしいので、Jetty8編、Tomcat7編に続き、今回はJava EE 7でやってみることにする。
Java EE 7が使えるAPサーバが必要なので、GlassFish 4.0 Promoted Buildsをここからダウンロードした。
そんなわけで、今回の環境は以下。
サーバ:GlassFish 4.0 Promoted Build 71
クライアント:Firefox 18
で、サーバ側のソースコード。
package test; import javax.websocket.WebSocketClose; import javax.websocket.WebSocketEndpoint; import javax.websocket.WebSocketMessage; import javax.websocket.WebSocketOpen; import org.apache.log4j.Logger; @WebSocketEndpoint("echo") public class EchoServer { private static final Logger logger = Logger.getLogger(EchoServer.class); @WebSocketOpen public void openConnection() { logger.info("Open"); } @WebSocketClose public void closeConnection() { logger.info("Close"); } @WebSocketMessage public String echo(String message) { logger.info("received:" + message); return message; } }
JettyやTomcatと違って、アノテーションだらけ。
簡単に説明するとこんな感じ。
@WebSocketEndpoint
WebSocketのエンドポイント。パラメータはコンテキストパスに続くパス。上のように"echo"を渡している場合は
ws://ホスト名:ポート番号/コンテキストルート/echo
となる
@WebSocketOpen
コネクション確立時に呼ばれる
@WebSocketClose
コネクション切断時に呼ばれる
@WebSocketMessage
メッセージ受信時に呼ばれる
素直な名前なのでわかりやすい。
そして、下がクライアント側のHTML。前回、前々回とは接続先のみ異なっている。
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>WebSocket Test</title> </head> <body> <div id="status">ステータス:未接続</div> <input type="text" id="msg"> <button onclick="sendMessage()">send</button> <br> <textarea id="data" rows="10" cols="50" readonly></textarea> <br> <button onclick="closeConnection()">close</button> <script type="text/javascript"> var con_status = document.getElementById("status") var msg = document.getElementById("msg"); var data = document.getElementById("data"); var ws = new WebSocket("ws://localhost:8080/WebSocket_JavaEE7/echo"); ws.onopen = function(e) { con_status.textContent = "ステータス:接続済み"; } ws.onmessage = function(e) { var message = e.data; data.textContent += message + "\n"; } ws.onclose = function(e) { con_status.textContent = "ステータス:未接続"; } function sendMessage() { ws.send(msg.value); msg.value = ""; } function closeConnection() { ws.close(); } </script> </body> </html>