web-dev-qa-db-fra.com

Comment créer un serveur WebSocket intégré 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 Jetty incorporés que je peux trouver montrent toujours quelque chose comme le suivant, 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
Alex Pritchard

Mise à jour: 2 décembre 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

Il y a un exemple trouvé dans les cas de 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

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 souhaitez lier le WebSocketHandler à un autre contexte, encapsulez-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 liera votre websocket à

http://localhost:8080/echo/
34
Joakim Erdfelt

Voici l'approche servlet:

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

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

2) Créez un descripteur web.xml pour la 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, lorsque 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