Java 如何创建嵌入式WebSocket服务器Jetty 9?

Java 如何创建嵌入式WebSocket服务器Jetty 9?,java,websocket,jetty,embedded-jetty,Java,Websocket,Jetty,Embedded Jetty,我讨厌问这么模糊的问题,但我很难找到一个简单的例子。以下是我目前掌握的情况: public class JettyWebSocketServlet extends WebSocketServlet{ @Override public void configure(WebSocketServletFactory factory) { factory.register(MyEchoSocket.class); } } @WebSocket public cl

我讨厌问这么模糊的问题,但我很难找到一个简单的例子。以下是我目前掌握的情况:

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连接请求的嵌入式服务器?

更新:2013年12月2日

有关带WebSocket的嵌入式码头的最新示例,请参见:

原始答案

测试用例中有一个例子

简短答复:

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/

以下是servlet方法:

1) 在这种情况下,不需要使用此代码(这是容器的责任):

2) 为servlet创建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>
消息是通过MyEchoSocket的onText方法处理的

下面是更多了解servlet的教程


祝你好运。

+1对于包含JSR-356示例的更新,我正在尝试用junit编写一个测试。用websocket servlet启动嵌入式jetty服务器似乎是可行的。但是,尝试使用
container.connectToServer(…)连接到它
抛出java.util.concurrent.RejectedExecutionException:org.eclipse.jetty.util.thread。NonBlockingThread@70cebf7@DominicBartl提交了一份新的question@JoakimErdfelt我做了,如果能包含一个代码片段来展示如何实现
MyEchoSocket
类,那就太好了。
<!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>
var ws = new WebSocket("ws://localhost:8080/hello");
ws.send("text");