Alex Pritchard Alex Pritchard - 3 months ago 33
Java Question

How do I create an embedded WebSocket server Jetty 9?

I hate asking such a vague question, but I'm having a hard time finding a simple example. Here's what I have so far:

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();
}
}
}


The embedded Jetty examples I can find always show something like the following, to start a Server instance running, but I don't know how to instantiate my WebSocketServlet.

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


How do I create an embedded server that can handle WebSocket connection requests?

Answer

Update: Dec 2, 2013

For an up to date example of the Embedded Jetty with WebSocket see:

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

Original Answer

There's an example found in the test cases.

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

Short Answer:

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();

This will create a simple server that handles 1 context, the root context.

http://localhost:8080/

If you want to bind the WebSocketHandler to another context, wrap it in a 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();

This will bind your websocket to

http://localhost:8080/echo/