2013-03-26 4 views
27

Odio porre una domanda così vaga, ma sto facendo fatica a trovare un semplice esempio. Ecco quello che ho finora:Come si crea un server WebSocket incorporato 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(); 
     } 
    } 
} 

Gli esempi Jetty incorporati posso trovare mostrano sempre qualcosa di simile a quanto segue, per avviare un'istanza del server in esecuzione, ma non so come creare un'istanza mia WebSocketServlet.

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

Come si crea un server incorporato in grado di gestire le richieste di connessione WebSocket?

risposta

33

Aggiornamento: 2 dic 2013

Per un aggiornato esempio del molo Embedded con WebSocket vedi:

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

risposta originale

C'è un esempio trovato nei casi di test.

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

Risposta breve:

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

Questo creerà un semplice server che gestisce 1 contesto, il contesto radice.

http://localhost:8080/ 

Se si desidera associare il WebSocketHandler in un altro contesto, avvolgerlo in un 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(); 

Ciò vincolare il proprio websocket a

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

Grazie, questo ha fatto il trucco! –

+3

+1 per l'aggiornamento che include un esempio con JSR-356 – betomontejo

+0

Sto provando a scrivere un test con junit. L'avvio di un server jetty incorporato con il servlet websocket sembra funzionare. Comunque provando a connettersi con '' 'container.connectToServer (...)' '' genera java.util.concurrent.RejectedExecutionException: [email protected] –

6

Ecco approccio servlet:

1) In questo caso, non hanno bisogno di utilizzare questo codice (è il contenitore responsabilità):

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

2) Creare descrittore web.xml per 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> 

Ora, quando si scrive JS:

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

messaggio viene gestito con il metodo ONTESTO della vostra MyEchoSocket

Ecco tutorial per servlet più comprensione, tutorial

Buona fortuna.