2013-03-26 95 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

好運。