Comment créer un serveur websocket embarqué Jetty 9?

Je déteste poser une question aussi vague, mais j'ai du mal à trouver un exemple simple. Voici ce que j'ai jusqu'à présent:

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

Les exemples de Jetée intégrés que je peux trouver montrent toujours quelque chose comme ce qui suit, pour démarrer une instance de serveur en cours d'exécution, mais je ne sais pas comment instancier mon WebSocketServlet.

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

Comment créer un serveur intégré capable de gérer les demandes de connexion WebSocket?

30
demandé sur Alex Pritchard 2013-03-26 23:05:23

2 réponses

Mise À Jour: Déc 2, 2013

Pour un exemple à jour de la jetée intégrée avec WebSocket, voir:

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

Réponse Originale À Cette Question

Il y a un exemple trouvé dans le test cas.

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

Réponse Courte:

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

Cela va créer un serveur simple qui gère 1 contexte, le contexte racine.

http://localhost:8080/

Si vous voulez lier le WebSocketHandler à un autre contexte, enveloppez-le dans 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();

Cela va lier votre websocket à

http://localhost:8080/echo/
34
répondu Joakim Erdfelt 2013-12-02 17:56:51

Voici l'approche servlet:

1) dans ce cas, n'avez pas besoin d'utiliser ce code (c'est la responsabilité du conteneur):

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

2) Créer web.descripteur xml pour 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>

Maintenant, quand vous écrivez JS:

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

Le Message est géré avec la méthode onText de votre MyEchoSocket

Voici un tutoriel pour mieux comprendre les servlets, tutoriel

Bonne chance.

6
répondu Artyom Chernetsov 2014-10-10 00:46:19