Node.js Socket.IO client doesn't connect to the netty-socketio Spring Boot Socket.IO server

375 Views Asked by At

I'm facing an issue with setting up Socket.IO for a project. I'm using Spring Boot with the netty-socketio (V2.0.3) dependency for my socket server. It supports 1.x - 4.x versions of Socket.IO clients, as per the release documentation. The server is running, and I've tested it using Postman. I'm able to connect and listen to events and receive acknowledgements etc.

For the client, I'm using Node.js with the socket.io-client(V4.7.2) dependency. I can't for the life for me figure out why it doesn't connect to the server though.

What am I doing wrong? Couldn't find any solution after hours of searching, any help would be appreciated!

Here's my socket.io client code:

const io = require('socket.io-client');
const socket = io.connect('http://localhost:9092', {reconnect: true, transports:['websocket','polling']});
socket.on('connect', () => {
console.log('Connected to socket:', socket.id);
});
socket.on('greetings', (message) => {
console.log("Received message from server: ", message);
});
socket.emit('greetings', '{"message":"Test Message From Node.js"}');
});

Here's my socket.io server code:

@org.springframework.context.annotation.Configuration
public class SocketIOConfig {

    @Value("${socket-io.server.host}")
    private String host;

    @Value("${socket-io.server.port}")
    private Integer port;

    @Bean
    public SocketIOServer socketIOServer() {
        Configuration config = new Configuration();
        config.setHostname(host);
        config.setPort(port);
        SocketIOServer socketIOServer = new SocketIOServer(config);
        socketIOServer.start();
        return socketIOServer;
    }
}

@Component
public class SocketIOBrokerResource {

    private static final Logger logger = LoggerFactory.getLogger(SocketIOBrokerResource.class);

    @Autowired
    private SocketIOServer socketIOServer;

    public SocketIOBrokerResource(SocketIOServer socketIOServer){
        this.socketIOServer=socketIOServer;
        this.socketIOServer.addConnectListener(onConnected());
        this.socketIOServer.addDisconnectListener(onDisconnected());
        this.socketIOServer.addEventListener("greetings", GreetingsPayload.class,  onMessageReceived());
    }

    private ConnectListener onConnected() {
        return client -> {
            HandshakeData handshakeData = client.getHandshakeData();
            logger.info("Client[{}] - Connected to greetings module through '{}'", client.getSessionId(), handshakeData.getUrl());
        };
    }

    private DisconnectListener onDisconnected() {
        return client -> logger.info("Client[{}] - Disconnected from greetings module.", client.getSessionId());
    }

    private DataListener<GreetingsPayload> onMessageReceived() {
        return (client, data, ackSender) -> {
            logger.info("Client[{}] - Received greetings message '{}'", client.getSessionId(), data);
            socketIOServer.getBroadcastOperations().sendEvent("greetings", client, data);
            ackSender.sendAckData("Greetings message sent successfully");
        };
    }
}

@Data
@AllArgsConstructor
@NoArgsConstructor
public class GreetingsPayload {

    private String message;
}

Here's the error trace I see when trying to connect using Node.js socket.io-client:

socket.io-client:url parse http://localhost:9092 +0ms  
socket.io-client new io instance for http://localhost:9092 +0ms  
socket.io-client:manager readyState closed +0ms  
socket.io-client:manager opening http://localhost:9092 +0ms  
engine.io-client:socket creating transport "websocket" +0ms  

engine.io-client:socket options:   {"path":"/socket.io/","agent":false,"withCredentials":false,"upgrade":true,"timestampParam":"t","rememberUpgrade":false,"addTrailingSlash":true,"rejectUnauthorized":true,"perMessageDeflate":{"threshold":1024},"transportOptions":{},"closeOnBeforeunload":false,"reconnect":true,"transports":\["websocket","polling"\],"hostname":"localhost","secure":false,"port":"9092","query":{"EIO":4,"transport":"websocket"},"socket":{"binaryType":"nodebuffer","writeBuffer":\[\],"secure":false,"hostname":"localhost","port":"9092","transports":\["websocket","polling"\],"prevBufferLen":0,"opts":{"path":"/socket.io/","agent":false,"withCredentials":false,"upgrade":true,"timestampParam":"t","rememberUpgrade":false,"addTrailingSlash":true,"rejectUnauthorized":true,"perMessageDeflate":{"threshold":1024},"transportOptions":{},"closeOnBeforeunload":false,"reconnect":true,"transports":\["websocket","polling"\],"hostname":"localhost","secure":false,"port":"9092"},"id":null,"upgrades":null,"pingInterval":null,"pingTimeout":null,"pingTimeoutTimer":null,"readyState":"opening"}} +0ms  

engine.io-client:socket setting transport websocket +32ms  
socket.io-client:manager connect attempt will timeout after 20000 +34ms  
socket.io-client:manager readyState opening +1ms  
engine.io-client:socket socket error {"description":{},"type":"TransportError"} +13ms  
socket.io-client:manager error +11ms  
socket.io-client:manager cleanup +1ms  

TransportError: websocket error  
  at WS.onError (D:\\socketio-nodejs-client\\node_modules\\engine.io-client\\build\\cjs\\transport.js:46:37)
  at ws.onerror (D:\\socketio-nodejs-client\\node_modules\\engine.io-client\\build\\cjs\\transports\\websocket.js:77:39)
  at callListener (D:\\socketio-nodejs-client\\node_modules\\ws\\lib\\event-target.js:290:14)
  at WebSocket.onError (D:\\socketio-nodejs-client\\node_modules\\ws\\lib\\event-target.js:230:9)
  at WebSocket.emit (node:events:513:28)
  at emitErrorAndClose (D:\\socketio-nodejs-client\\node_modules\\ws\\lib\\websocket.js:1002:13)
  at ClientRequest.\<anonymous\> (D:\\socketio-nodejs-client\\node_modules\\ws\\lib\\websocket.js:854:5)
  at ClientRequest.emit (node:events:513:28)
  at Socket.socketErrorListener (node:\_http_client:502:9)
  at Socket.emit (node:events:513:28) {
description: ErrorEvent {
\[Symbol(kTarget)\]: WebSocket {
\_events: \[Object: null prototype\],
\_eventsCount: 4,
\_maxListeners: undefined,
\_binaryType: 'nodebuffer',
\_closeCode: 1006,
\_closeFrameReceived: false,
\_closeFrameSent: false,
\_closeMessage: \<Buffer \>,
\_closeTimer: null,
\_extensions: {},
\_paused: false,
\_protocol: '',
\_readyState: 2,
\_receiver: null,
\_sender: null,
\_socket: null,
\_bufferedAmount: 0,
\_isServer: false,
\_redirects: 0,
\_url: 'ws://localhost:9092/socket.io/?EIO=4&transport=websocket',
\_req: null,
\[Symbol(kCapture)\]: false
},
\[Symbol(kType)\]: 'error',
\[Symbol(kError)\]: Error: connect ECONNREFUSED ::1:9092
at TCPConnectWrap.afterConnect \[as oncomplete\] (node:net:1494:16) {
errno: -4078,
code: 'ECONNREFUSED',
syscall: 'connect',
address: '::1',
port: 9092
},
\[Symbol(kMessage)\]: 'connect ECONNREFUSED ::1:9092'
},
context: undefined,
type: 'TransportError'
}

socket.io-client:manager will wait 898ms before reconnect attempt +35ms  
engine.io-client:socket socket close with reason: "transport error" +36ms 
0

There are 0 best solutions below