3 votes

port d'écoute du servlet websocket de tomcat

J'essaie d'écrire une servlet qui utilise org.apache.catalina.websocket.WebSocketServlet . J'ai trouvé un exemple de chat websocket, mais je n'arrive pas à comprendre comment je peux spécifier le port d'écoute pour un serveur websocket (qui est implémenté dans cette servlet) ? Par exemple, j'ai besoin d'écouter la connexion des clients sur le port 11337 . Mais comment puis-je l'exprimer ?

OK, voici le code (simplifié) :

public class TestServlet extends WebSocketServlet {
    private static final Logger logger = LoggerFactory.getLogger(TestServlet.class);

    public TestServlet() {
        logger.error("Initializing TestServlet");
    }

    @Override
    protected StreamInbound createWebSocketInbound(String subProtocol, HttpServletRequest request) {
        logger.error("New WS connection, subProtocol=" + subProtocol + ", request=" + request.getRequestURL());
        return new TestConnection();
    }

    private class TestConnection extends MessageInbound {

        @Override
        protected void onBinaryMessage(ByteBuffer byteBuffer) throws IOException {
            logger.error("onBinaryMessage");
        }

        @Override
        protected void onTextMessage(CharBuffer charBuffer) throws IOException {
            logger.error("onBinaryMessage: " + charBuffer);
            sendMessage("Test message");
        }

        public void sendMessage(String message) {
            WsOutbound outbound = this.getWsOutbound();
            CharBuffer cb = CharBuffer.wrap(message);
            try {
                outbound.writeTextMessage(cb);
            } catch (IOException e) {
                logger.error("failed to write outbound");
            }
        }
    }
}

Je n'arrive pas à trouver où et comment je peux définir le port d'écoute. Site officiel websocket La documentation n'aide pas non plus beaucoup.

Je suppose donc qu'il peut être défini quelque part dans les paramètres de la servlet, mais je ne trouve pas où.

Quelqu'un a-t-il une idée ?

4voto

Badal Points 552

La WebSocket est conçue pour fonctionner sur le protocole HTTP et n'a donc pas de port d'écoute différent comme les sockets TCP normaux, mais elle utilise le même port de serveur que celui sur lequel elle est déployée.

Donc, dans votre cas, si vous utilisez le serveur Tomcat, websocket peut utiliser le port 8080 (si vous ne l'avez pas modifié explicitement) pour communiquer. Vous pouvez avoir besoin de surcharger les méthodes onOpen et onClose de la classe MessageInbound pour être notifié de l'établissement et de la fermeture de la connexion. Reportez-vous à l'exemple de code ci-dessous pour plus de détails.

public class IncomingMessageHandler extends MessageInbound {

    private WsOutbound myoutbound;
    public IncomingMessageHandler() {

    }

    @Override
    public void onOpen(WsOutbound outbound) {
        logger.info("Open Client.");
        this.myoutbound = outbound;
    }

    @Override
    public void onClose(int status) {
        logger.info("Close Client.");           
    }

    /**
     * Called when received plain Text Message
     */
    @Override
    public void onTextMessage(CharBuffer cb) throws IOException {

    }

    /**
     * We can use this method to pass image binary data, eventually !
     */
    @Override
    public void onBinaryMessage(ByteBuffer bb) throws IOException {

    }

    public synchronized void sendTextMessage(String message) {
        try {
            CharBuffer buffer = CharBuffer.wrap(message);
            this.getMyoutbound().writeTextMessage(buffer);
            this.getMyoutbound().flush();

        } catch (IOException e) {   
        }
    }

    /**
     * Set timeout in milliseconds, -1 means never
     */
    @Override
    public int getReadTimeout() {
        return -1;
    }

    public WsOutbound getMyoutbound() {
        return myoutbound;
    }
    public void setMyoutbound(WsOutbound myoutbound) {
        this.myoutbound = myoutbound;
    }
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X