【问题标题】:How do I create an embedded WebSocket server Jetty 9?如何创建嵌入式 WebSocket 服务器 Jetty 9?
【发布时间】:2013-03-16 17:40:47
【问题描述】:

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

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

【问题讨论】:

    标签: java websocket jetty embedded-jetty


    【解决方案1】:

    更新: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/
    

    【讨论】:

    • +1 用于更新,其中包括 JSR-356 示例
    • 我正在尝试使用 junit 编写测试。使用 websocket servlet 启动嵌入式码头服务器似乎可以工作。但是尝试使用container.connectToServer(...) 连接它会抛出 java.util.concurrent.RejectedExecutionException: org.eclipse.jetty.util.thread.NonBlockingThread@70cebf7
    • @DominicBartl 提出新问题
    • 最好包含一个代码 sn-p 来展示如何实现 MyEchoSocket 类。
    【解决方案2】:

    这里是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 方法处理

    这里是更多理解 servlet 的教程,tutorial

    祝你好运。

    【讨论】:

      猜你喜欢
      • 2017-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-23
      • 2015-06-24
      • 2012-09-26
      • 1970-01-01
      • 2013-04-20
      • 2020-05-18
      相关资源
      最近更新 更多