Has socket io server in java stopped working along with Jetty 11?
Tags: socketio
Published: 2024-04-24 10:48:48

Based on socket io server documentation
(https://socketio.github.io/engine.io-server-java/using.html#jetty-server) and Jetty 11 APIs, it appears that it is not possible to migrate "socket io bridge jetty" from Jetty 9.0 to Jetty 11. 


With latest version of Jetty I am trying to use JettyWebSocketServlet and JettyWebSocketCreator along with JettyWebSocketHandler provided by engine-io-server-jetty. But it is not working.

Following is my piece of code
package com.egain.live.framework.socketIO;


import io.socket.engineio.server.Emitter;
import io.socket.engineio.server.EngineIoServer;
import io.socket.engineio.server.EngineIoServerOptions;
import io.socket.engineio.server.JettyWebSocketHandler;
import io.socket.socketio.server.SocketIoNamespace;
import io.socket.socketio.server.SocketIoServer;
import io.socket.socketio.server.SocketIoSocket;
import org.eclipse.jetty.websocket.core.WebSocketComponents;
import org.eclipse.jetty.websocket.core.server.WebSocketMappings;
import org.eclipse.jetty.websocket.server.JettyServerUpgradeRequest;
import org.eclipse.jetty.websocket.server.JettyServerUpgradeResponse;
import org.eclipse.jetty.websocket.server.JettyWebSocketCreator;
import org.eclipse.jetty.websocket.server.JettyWebSocketServlet;
import org.eclipse.jetty.websocket.server.JettyWebSocketServletFactory;

import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.time.Duration;

;

@WebServlet(name = "Socket IO Servlet", urlPatterns = { "/socketiofw/*" })
public class SocketIoServlet extends JettyWebSocketServlet {

    private EngineIoServer mEngineIoServer;
    private SocketIoServer mSocketIoServer;

    @Override
    public void configure(JettyWebSocketServletFactory factory) {
        EngineIoServerOptions options = EngineIoServerOptions.newFromDefault();
        options.setAllowSyncPolling(true);
        options.setPingInterval(10000);
        this.mEngineIoServer = new EngineIoServer(options);
        mSocketIoServer = new SocketIoServer(mEngineIoServer);
        factory.setIdleTimeout(Duration.ofSeconds(600L));
        //factory.register(MySocket.class);
        factory.addMapping("/", new MyJettySocketCreator(mEngineIoServer));
    }

    public SocketIoServlet() {

    }

    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws IOException {
        mEngineIoServer.handleRequest(request, response);
        SocketIoNamespace namespace = mSocketIoServer.namespace("/");
        mEngineIoServer.on("connection", new Emitter.Listener() {
            @Override
            public void call(Object... args) {
                SocketIoSocket socket = (SocketIoSocket) args[0];
                // Do something with socket

                // Attaching to 'foo' event
                socket.on("foo", new Emitter.Listener() {
                    @Override
                    public void call(Object... args) {
                        System.out.println("Received 'foo' event"+args[0]);
                        socket.send("toClient", args[0]);
                    }
                });

                socket.send("toClient", "Hello from socket io server", 1);
            }
        });

        // Broadcasting event 'foo' with args 'bar arg' to room 'room'
        //namespace.broadcast("room", "foo", "bar arg");


    }
}

class MyJettySocketCreator implements JettyWebSocketCreator {
    EngineIoServer mEngineIoServer;
    MyJettySocketCreator(EngineIoServer engineIoServer) {
        System.out.println("MyJettySocketCreator constructor");

        mEngineIoServer = engineIoServer;
    }

    @Override
    public Object createWebSocket(JettyServerUpgradeRequest jettyServerUpgradeRequest, JettyServerUpgradeResponse jettyServerUpgradeResponse) {
        return new JettyWebSocketHandler(mEngineIoServer);
    }
}