2013-03-26 84 views
27

我讨厌问这样一个模糊的问题,但我很难找到一个简单的例子。这是我到目前为止有:如何创建嵌入式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(); 
     } 
    } 
} 

嵌入式码头的例子我能找到的总是显示类似于下面的东西,开始运行一个服务器实例,但我不知道如何实例我WebSocketServlet。

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

如何创建一个可以处理WebSocket连接请求的嵌入式服务器?

回答

33

更新:2013年12月2日

对于高达嵌入式码头的最新例子与WebSocket的看到:

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

谢谢你,这个伎俩! – 2013-03-26 19:32:11

+3

+1为更新,其中包括与JSR-356的示例 – betomontejo 2014-03-21 15:51:43

+0

我试图用junit编写测试。使用websocket servlet启动嵌入式jetty服务器似乎可行。然而,试图用'''container.connectToServer(...)连接到它'''会抛出java.util.concurrent.RejectedExecutionException:org。[email protected] – 2014-07-13 19:36:48

6

这里是servlet方法:

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

下面是更多的理解servlet的教程,tutorial

好运。