如何创建一个嵌入式的WebSocket服务器Jetty 9?

37

我很讨厌问这样一个模糊的问题,但是我很难找到一个简单的例子。以下是我目前为止的内容:

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示例总是展示像下面这样的东西,启动一个Server实例运行,但我不知道如何实例化我的WebSocketServlet。
        Server server = new Server(8080);
        server.start();
        server.join();

我该如何创建一个嵌入式服务器,以便处理WebSocket连接请求?

2个回答

41

更新:2013年12月2日

有关使用WebSocket的嵌入式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/

4
+1 对于包含 JSR-356 示例的更新。 - betomontejo
我正在尝试使用JUnit编写测试。使用WebSocket Servlet启动内嵌的Jetty服务器似乎可以正常工作。但是,当尝试使用container.connectToServer(...)连接时,会抛出java.util.concurrent.RejectedExecutionException: org.eclipse.jetty.util.thread.NonBlockingThread@70cebf7。 - Dominic
@DominicBartl 提交一个新问题。 - Joakim Erdfelt
@JoakimErdfelt 我做了 http://stackoverflow.com/questions/24726816/junit-test-with-javax-websocket-on-embedded-jetty-throws-rejectedexecutionexcept - Dominic
最好包含一个代码片段来展示如何实现MyEchoSocket类。 - user979222

7

以下是Servlet的方法:

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

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

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>

现在,当您编写JS代码时:
var ws = new WebSocket("ws://localhost:8080/hello");
ws.send("text");

您需要在MyEchoSocket的onText方法中处理消息。

这里有一个教程,更好地理解Servlets: 教程

祝你好运。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接