web-dev-qa-db-ja.com

埋め込みWebSocketサーバーJetty 9を作成するにはどうすればよいですか?

私はそのようなあいまいな質問をするのは嫌いですが、簡単な例を見つけるのに苦労しています。ここに私が持っているものがあります:

public class JettyWebSocketServlet extends WebSocketServlet{
    @Override
    public void configure(WebSocketServletFactory factory) {
        factory.register(MyEchoSocket.class);
    }
}

@WebSocket
public class MyEchoSocket {
    @OnWebSocketMessage
    public void onText(WebSocketConnection conn, String message) {
        System.out.println("text: " + message);
        try {
            conn.write(null, new FutureCallback(), "got: " + message);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

私が見つけることができる埋め込みJettyの例では、サーバーインスタンスを実行するために常に次のようなものが表示されますが、WebSocketServletをインスタンス化する方法がわかりません。

        Server server = new Server(8080);
        server.start();
        server.join();

WebSocket接続要求を処理できる組み込みサーバーを作成するにはどうすればよいですか?

30
Alex Pritchard

更新:2013年12月2日

WebSocketを使用したEmbedded Jettyの最新の例については、以下を参照してください。

https://github.com/jetty-project/embedded-jetty-websocket-examples

元の回答

テストケースには例があります。

http://git.Eclipse.org/c/jetty/org.Eclipse.jetty.project.git/tree/jetty-websocket/websocket-server/src/test/Java/org/Eclipse/jetty/ websocket/server/examples/echo/ExampleEchoServer.Java

短い答え:

Server server = new Server(8080);
WebSocketHandler wsHandler = new WebSocketHandler()
    {
        @Override
        public void configure(WebSocketServletFactory factory)
        {
            factory.register(MyEchoSocket.class);
        }
    };
server.addHandler(wsHandler);
server.start();
server.join();

これにより、1つのコンテキスト(ルートコンテキスト)を処理する単純なサーバーが作成されます。

http://localhost:8080/

WebSocketHandlerを別のコンテキストにバインドする場合は、ContextHandlerでラップします。

Server server = new Server(8080);
WebSocketHandler wsHandler = new WebSocketHandler()
    {
        @Override
        public void configure(WebSocketServletFactory factory)
        {
            factory.register(MyEchoSocket.class);
        }
    };
ContextHandler context = new ContextHandler();
context.setContextPath("/echo");
context.setHandler(wsHandler);
server.addHandler(context);
server.start();
server.join();

これにより、websocketがバインドされます

http://localhost:8080/echo/
34
Joakim Erdfelt

サーブレットアプローチは次のとおりです。

1)この場合、このコードを使用する必要はありません(コンテナの責任です):

Server server = new Server(8080);
                server.start();
                server.join();

2)サーブレットのweb.xml記述子を作成します。

<!DOCTYPE web-app PUBLIC
 "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
 "http://Java.Sun.com/dtd/web-app_2_3.dtd" >

<web-app>
    <display-name>WebSocket application</display-name>
    <servlet>
        <servlet-name>servlet</servlet-name>
        <servlet-class>com.example.websocket.JettyWebSocketServlet</servlet-class>
    </servlet>

    <servlet-mapping>
        <servlet-name>servlet</servlet-name>
        <url-pattern>/hello</url-pattern>
    </servlet-mapping>
</web-app>

さて、JSを書くとき:

var ws = new WebSocket("ws://localhost:8080/hello");
ws.send("text");

メッセージはMyEchoSocketのonTextメソッドで処理されます

サーブレットをより深く理解するためのチュートリアル tutorial

幸運を。

6