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>