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