Tyrus サンプル

JSR 356 - Java API for WebSocket のリファレンス実装である Project Tyrus のサンプルをクライアント付きで書き起こした。サーブレットコンテナは面倒なのでスタンドアロンモード。実際のものは ihiroky/tyrus-sample · GitHub に置いてあるので、下記引用は適当に端折って書く。

build.gradle

mavenでとってくるために必要なエントリは3つ。

dependencies {
    compile 'org.glassfish.tyrus:tyrus-server:1.0'
    compile 'org.glassfish.tyrus:tyrus-client:1.0'
    compile 'org.glassfish.tyrus:tyrus-container-grizzly:1.0'
}

サーバエンドポイント

書くイベントに対するハンドラを記述。初期化など必要なければ@OnMessageだけでいい。

@ServerEndpoint(value = "/echo")
public class EchoEndpoint {

    @OnOpen
    public void onOpen(Session session, EndpointConfig config) throws IOException {
        System.out.println("onOpen: " + session);
    }

    @OnClose
    public void onClose(Session session, CloseReason reason) throws IOException {
        System.out.println("onClose: " + session + ", " + reason);
    }

    @OnMessage
    public void onMessage(Session session, String message) {
        System.out.println("onMessage: " + session + ", " + message);
        for (Session s : session.getOpenSessions()) {
            s.getAsyncRemote().sendText(message);
        }
    }

    @OnError
    public void onError(Session session, Throwable t) {
        System.out.println("onError: " + session + ", " + t);
    }
}

サーバ

WebSocketサービス以外に、index.htmlを返すためのHttpサーバをGrizzlyで作る(TyrusにGrizzlyがくっついてくる)。

public class SampleStandalone {

    private static final String HOST = "localhost";
    private static final int WEB_SOCKET_PORT = 8025;
    private static final String WEB_SOCKET_CONTEXT = "/websockets";
    private static final int HTTP_SERVER_PORT = 8080;
    private static final String HTTP_SERVER_CONTEXT_ROOT = ".";

    /*
     * access to http://localhost:8080/ with a web browser.
     */
    public static void main(String[] args) {
        Server server = new Server(HOST, WEB_SOCKET_PORT, WEB_SOCKET_CONTEXT, EchoEndpoint.class);
        HttpServer httpServer = HttpServer.createSimpleServer(HTTP_SERVER_CONTEXT_ROOT, HOST, HTTP_SERVER_PORT);
        try {
            server.start();
            httpServer.start();
            System.out.println("Please press a key to stop the server.");
            System.in.read();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            httpServer.stop();
            server.stop();
        }
    }
}

サーバが返す index.html

JavascriptでWebsocket操作。

<input id="open" type="button" value="open" onclick="wsOpen()"/>
<input id="close" type="button" value="close" onclick="wsClose()"/>
<br/>
<input id="text" type="text" onchange="wsSend(this)"/>
<div id="msg"></div>
<script type="text/javascript">
    var webSocket_;

    var wsOpen = function() {
      webSocket_ = new WebSocket('ws://localhost:8025/websockets/echo');
      webSocket_.onmessage = function(e) {
        dump(e);
        var msg = document.getElementById('msg');
        msg.innerHTML = e.data + '<br/>' + msg.innerHTML;
      };
    };

    var wsClose = function() {
      if (webSocket_) {
        webSocket_.close(1000, 'Closed by user.');
        webSocket_ = null;
      }
    };

    var wsSend = function(t) {
      if (webSocket_) {
        console.log('send message : ' + t.value);
        webSocket_.send(t.value);
      }
    };
</script>

Javaクライアント

サーバサイドのアノテーション(@OnMessage等)なし版で記述。クライアント本体はTyrusの実装(org.glassfish.tyrus.client.ClientManager)を使う。


参考:Tyrus 1.0 User Guide