Skip to content

Continuous Connection request to server from engine.io-client #20

@jeevaengg21

Description

@jeevaengg21

Server: Wildfly 10.1
Browser: Chrome
Frontend: Reactjs
Socket server: engine.io-server-java V 1.3.4
Socket client: engine.io-client V 3.4.0

Note: Followed the below documentation link to host the generic java engine.io server.
https://socketio.github.io/engine.io-server-java/using.html

Issue: When the UI is launched, engine.io triggers the connection request to the sever. When checking the sever log connection request is reached the servlet, now the issue is client is continuously sending the connection request to servlet and WebSocket connection is not establishing it goes like a never-ending process. Attacthed the source for the reference please check and advice want went wrong in the code.

image

Project Structure:

image

ReactJS as front-end:

App.JS

import React from 'react';
var enginesocket = require('engine.io-client')('ws://localhost:8080', { transport: ["websocket"], 
 upgrade: true, reconnection: false });

class App extends React.Component {

 componentDidMount() {
    
    enginesocket.on('open', function () {
      console.log("Opened");
      enginesocket.on('message', function (data) {
        console.log("Message from server :: ", data);
      });
    });
  }
}

EngineIoServlet -

URLPattens is kept as "/" since WAR file name is "engine.io". So the context "/engine.io/" will be exposed by wildfly server.

@WebServlet(name = "EngineIoServlet", urlPatterns = {"/"})
public class EngineIoServlet extends HttpServlet {

    private final EngineIoServer mEngineIoServer = new EngineIoServer();
    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws IOException {
        System.out.println("mEngineIoServer?? " + mEngineIoServer);        
        mEngineIoServer.handleRequest(request, response);
        mEngineIoServer.on("connection", new Emitter.Listener() {
            @Override
            public void call(Object... args) {
                EngineIoSocket socket = (EngineIoSocket) args[0];
                // Do something with socket like store it somewhere
                System.out.println("socket :: " + socket);
                socket.on("packet", new Emitter.Listener() {
                    @Override
                    public void call(Object... args) {
                        Packet packet = (Packet) args[0];
                        // Do something with packet.
                        System.out.println("packet :: " + packet.data);
                    }
                });            
                socket.on("message", new Emitter.Listener() {
                    @Override
                    public void call(Object... args) {
                        Object message = args[0];
                        // message can be either String or byte[]
                        // Do something with message.
                        System.out.println("message ::" + message);
                    }
                });
                socket.send(new Packet<>(Packet.MESSAGE, "foo"));
            }
        });

    }

ApplicationServerConfig


public final class ApplicationServerConfig implements ServerApplicationConfig {

    @Override
    public Set<ServerEndpointConfig> getEndpointConfigs(Set<Class<? extends Endpoint>> endpointClasses) {
        final HashSet<ServerEndpointConfig> result = new HashSet<>();
        result.add(ServerEndpointConfig.Builder
                .create(EngineIoEndpoint.class, "/")
                .build());

        return result;
    }

    @Override
    public Set<Class<?>> getAnnotatedEndpointClasses(Set<Class<?>> scanned) {
        return null;
    }
}

EngineIoEndpoint

public final class EngineIoEndpoint extends Endpoint {

    private Session mSession;
    private Map<String, String> mQuery;
    private EngineIoWebSocket mEngineIoWebSocket;

    private EngineIoServer mEngineIoServer; // The engine.io server instance

    @Override
    public void onOpen(Session session, EndpointConfig endpointConfig) {
        mSession = session;
        mQuery = ParseQS.decode(session.getQueryString());

        System.out.println("inside socket onOpen");

        mEngineIoWebSocket = new EngineIoWebSocketImpl();

        /*
         * These cannot be converted to lambda because of runtime type inference
         * by server.
         */
        mSession.addMessageHandler(new MessageHandler.Whole<String>() {
            @Override
            public void onMessage(String message) {
                mEngineIoWebSocket.emit("message", message);
            }
        });
        mSession.addMessageHandler(new MessageHandler.Whole<byte[]>() {
            @Override
            public void onMessage(byte[] message) {
                mEngineIoWebSocket.emit("message", (Object) message);
            }
        });

        mEngineIoServer.handleWebSocket(mEngineIoWebSocket);
    }

    @Override
    public void onClose(Session session, CloseReason closeReason) {
        super.onClose(session, closeReason);

        mEngineIoWebSocket.emit("close");
        mSession = null;
    }

    @Override
    public void onError(Session session, Throwable thr) {
        super.onError(session, thr);

        mEngineIoWebSocket.emit("error", "unknown error", thr.getMessage());
    }

    private class EngineIoWebSocketImpl extends EngineIoWebSocket {

        private RemoteEndpoint.Basic mBasic;

        EngineIoWebSocketImpl() {
            mBasic = mSession.getBasicRemote();
        }

        @Override
        public Map<String, String> getQuery() {
            return mQuery;
        }

        @Override
        public void write(String message) throws IOException {
            mBasic.sendText(message);
        }

        @Override
        public void write(byte[] message) throws IOException {
            mBasic.sendBinary(ByteBuffer.wrap(message));
        }

        @Override
        public void close() {
            try {
                mSession.close();
            } catch (IOException ignore) {
            }
        }
    }
}

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions