2013-03-26 10 views
27

Nienawidzę zadając tak mgliste pytanie, ale trudno mi znaleźć prosty przykład. Oto co mam do tej pory:Jak utworzyć osadzony serwer 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(); 
     } 
    } 
} 

Wbudowane przykłady Jetty mogę znaleźć zawsze pokazać coś jak poniżej, aby rozpocząć wystąpienie serwer działa, ale nie wiem, jak mój WebSocketServlet instancji.

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

Jak utworzyć wbudowany serwer obsługujący żądania połączenia z WebSocket?

Odpowiedz

33

Aktualizacja: 02 grudnia 2013

Na aktualną datę przykład Embedded Jetty z websocket patrz:

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

Original Odpowiedź

Jest przykładem znaleźć w przypadkach testowych.

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

Krótka odpowiedź:

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

To stworzy prosty serwer, który obsługuje 1 kontekst, kontekst korzeniowy.

Jeśli chcesz powiązać WebSocketHandler z innym kontekstem, zawiń go w 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(); 

To zwiąże swoją websocket do

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

Dziękuję, to załatwiło sprawę! –

+3

+1 dla aktualizacji, która zawiera przykład z JSR-356 – betomontejo

+0

Próbuję napisać test z junit. Uruchomienie wbudowanego serwera pomostowego z serwletem websocket wydaje się działać. Jednak próbując połączyć się z nim za pomocą '' container.connectToServer (...) '' 'throws java.util.concurrent.RejectedExecutionException: [email protected] –

6

Oto podejście servlet:

1) W tym przypadku, nie trzeba korzystać z tego kodu (jest to odpowiedzialność pojemnik):

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

2) Tworzenie deskryptora web.xml dla serwletu:

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

Teraz, kiedy piszesz JS:

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

wiadomość jest obsługiwana metodą ONTEKST swojej MyEchoSocket

Oto poradnik dla bardziej wyrozumiały apletów, tutorial

Powodzenia.