home ホーム search 検索 -  login ログイン  | reload edit datainfo version cmd icon diff delete  | help ヘルプ

日記/2012/01/22/JettyでWebSocketを試してみた。

日記/2012/01/22/JettyでWebSocketを試してみた。

日記 / 2012 / 01 / 22 / JettyでWebSocketを試してみた。
id: 1053 所有者: msakamoto-sf    作成日: 2012-01-22 13:17:12
カテゴリ: Java 

WebSocketについていよいよRFCも発行されたので、もう少し本格的にいじってみるかと思い、今さらながらgihyoの記事を参考にJettyでWebSocketを試してみた。

が・・・2010年8-9月頃の記事であるため、Jettyのバージョンが8となり、いろいろ記事のコードでは動かなくなってる。

まずインターフェイスが分離されている。記事ではWebSocketクラス一つをimplementしているが、Jetty 8 ではWebSocket.OnXXYYというように用途別に最低限度必要なinterfaceのみに分離されている。今回はチャットとしてテキストメッセージしか扱わないので、WebSocket.OnTextMessageをWebSocketとあわせてimplementする。

この時点で「こりゃあ、直接jetty-websocketのテストコード漁ったほうが早そうだ」と見切りをつけて、githubからjettyのコードをclone。
以下のテストコードが見つかったので、流用。

で、特にコンテキストパスとかは設定せずに実装。こんな感じになりました。

webSocketChat.MyWebSocket.java:

package webSocketChat;
 
import java.io.IOException;
import java.util.Set;
import java.util.concurrent.CopyOnWriteArraySet;
 
import org.eclipse.jetty.websocket.WebSocket;
 
public class MyWebSocket implements WebSocket, WebSocket.OnTextMessage {
 
    Connection conn;
 
    static Set<MyWebSocket> _connections = new CopyOnWriteArraySet<MyWebSocket>();
 
    public void onOpen(Connection paramConnection) {
        conn = paramConnection;
        synchronized (_connections) {
            _connections.add(this);
        }
    }
 
    public void onClose(int paramInt, String paramString) {
        synchronized (_connections) {
            _connections.remove(this);
        }
    }
 
    public void onMessage(String paramString) {
        for (MyWebSocket c : _connections) {
            try {
                c.conn.sendMessage(paramString);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
 
}

webSocketChat.MyWebSocketServer.java:

package webSocketChat;
 
import javax.servlet.http.HttpServletRequest;
 
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.server.handler.ResourceHandler;
import org.eclipse.jetty.server.nio.SelectChannelConnector;
import org.eclipse.jetty.websocket.WebSocket;
import org.eclipse.jetty.websocket.WebSocketHandler;
 
public class MyWebSocketServer extends Server {
    SelectChannelConnector _connector;
    WebSocketHandler _wsHandler;
    ResourceHandler _rsHandler;
 
    public MyWebSocketServer(int port, String dir) {
        _connector = new SelectChannelConnector();
        _connector.setPort(port);
        addConnector(_connector);
 
        _wsHandler = new WebSocketHandler() {
            public WebSocket doWebSocketConnect(
                    HttpServletRequest paramHttpServletRequest,
                    String paramString) {
                System.out.printf("protocol=%s¥n", paramString);
                return new MyWebSocket();
            }
        };
        _rsHandler = new ResourceHandler();
        _rsHandler.setDirectoriesListed(true);
        _rsHandler.setResourceBase(dir);
        _wsHandler.setHandler(_rsHandler);
        setHandler(_wsHandler);
    }
 
    private static void usage() {
        System.err.println("java -cp CLASSPATH " + MyWebSocketServer.class
                + " [ OPTIONS ]");
        System.err.println("  -p|--port PORT    (default 8080)");
        System.err.println("  -d|--docroot file (default 'src/main/resources/html')");
        System.exit(1);
    }
 
    public static void main(String... args) throws Exception {
 
        int port = 8080;
        String docroot = "src/main/resources/html";
 
        for (int i = 0; i < args.length; i++) {
            String a = args[i];
            if ("-p".equals(a) || "--port".equals(a))
                port = Integer.parseInt(args[++i]);
            else if ("-d".equals(a) || "--docroot".equals(a))
                docroot = args[++i];
            else if (a.startsWith("-"))
                usage();
        }
 
        MyWebSocketServer server = new MyWebSocketServer(port, docroot);
        server.start();
        server.join();
 
    }
}

で、HTMLファイルはどんなのを用意したかというと、こちらはGoogleのpywebsocketからそのままごっそりコピペ。

で、継ぎ接ぎだらけですが曲がりなりにもチャットが動きました。

JettyとWebSocket、両方勉強できて一石二鳥かとも思ったんですが、Jettyの構造とか使い方もう少し勉強しないとダメですね・・・。


プレーンテキスト形式でダウンロード
現在のバージョン : 1
更新者: msakamoto-sf
更新日: 2012-01-22 13:30:18
md5:94763ecca8fa05f9c32f02548f5a0cc8
sha1:e0153cb7aec4db6250dca6b3e2eebf34d83cff6c
コメント
コメントを投稿するにはログインして下さい。