2013-03-26 35 views
27

Tôi ghét hỏi một câu hỏi mơ hồ như vậy, nhưng tôi đang gặp khó khăn khi tìm một ví dụ đơn giản. Dưới đây là những gì tôi có cho đến nay:Làm thế nào để tạo một máy chủ WebSocket được nhúng 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(); 
     } 
    } 
} 

Các ví dụ Jetty nhúng Tôi có thể tìm luôn hiển thị một cái gì đó như sau, để bắt đầu một trường hợp máy chủ chạy, nhưng tôi không biết làm thế nào để nhanh chóng WebSocketServlet tôi.

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

Làm cách nào để tạo một máy chủ nhúng có thể xử lý yêu cầu kết nối WebSocket?

Trả lời

33

Cập nhật: 02 Tháng 12 2013

Đối với một cập nhật ví dụ về Jetty nhúng với WebSocket xem:

https://github.com/jetty-project/embedded-jetty-websocket-examples

gốc trả lời

Có một ví dụ được tìm thấy trong các trường hợp thử nghiệm.

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

ngắn Trả lời:

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(); 

này sẽ tạo ra một máy chủ đơn giản để xử lý 1 bối cảnh, bối cảnh gốc.

http://localhost:8080/ 

Nếu bạn muốn ràng buộc WebSocketHandler với ngữ cảnh khác, hãy quấn nó trong 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(); 

này sẽ ràng buộc WebSocket của bạn để

http://localhost:8080/echo/ 
+1

Cảm ơn bạn, điều này đã thực hiện thủ thuật! –

+3

+1 cho bản cập nhật bao gồm một ví dụ với JSR-356 – betomontejo

+0

Tôi đang cố gắng viết một bài kiểm tra với junit. Bắt đầu một máy chủ jetty nhúng với servlet websocket dường như hoạt động. Tuy nhiên cố gắng kết nối với nó bằng '' 'container.connectToServer (...)' '' ném java.util.concurrent.RejectedExecutionException: [email protected] –

6

Đây là cách tiếp cận servlet:

1) Trong trường hợp này, không cần phải sử dụng mã này (đó là trách nhiệm container):

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

2) Tạo bộ mô tả web.xml cho servlet:

<!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> 

Bây giờ, khi bạn viết JS:

var ws = new WebSocket("ws://localhost:8080/hello"); 
ws.send("text"); 

nhắn được xử lý bằng phương pháp onText của MyEchoSocket bạn

Dưới đây là hướng dẫn cho servlets hiểu biết nhiều hơn, tutorial

Chúc may mắn.

Các vấn đề liên quan