failed: Connection closed before receiving a handshake response
Problem
Hi I am using socket.io in project build on top of MEAN.IO (https://github.com/linnovate/mean) . I integrated the library successfully , on my local everything is working fine with no errors in console. but on deploying the same code on server it shows me an error as WebSocket connection to 'ws://ip.ip.ip.ip:3000/socket.io/?EIO=3&transport=websocket&sid=OpeM3YIJqVuTnt-dAAAY' failed: Connection closed before receiving a handshake response I had given options to socket for now to reconnect as : - var socket = io.connect(baseUrl, { 'reconnection': true, 'reconnectionDelay': 1000, 'reconnectionDelayMax': 5000, 'forceNew': true }); but still some times the socket remains inactive .
Unverified for your environment
Select your OS to check compatibility.
1 Fix
Fix WebSocket Handshake Failure in Socket.IO Deployment
The error 'Connection closed before receiving a handshake response' typically occurs due to network issues, server misconfiguration, or firewall settings that block WebSocket connections. In a production environment, differences in server configuration compared to local development can lead to this issue, especially if the server is behind a reverse proxy or load balancer that does not support WebSocket connections properly.
Awaiting Verification
Be the first to verify this fix
- 1
Check Server Configuration
Ensure that your server is configured to support WebSocket connections. If you are using a reverse proxy (like Nginx or Apache), make sure it is set up to handle WebSocket upgrades correctly.
nginxlocation /socket.io/ { proxy_pass http://localhost:3000; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection 'upgrade'; proxy_set_header Host $host; } - 2
Verify Firewall Settings
Check your server's firewall settings to ensure that the port used by your WebSocket server (e.g., port 3000) is open and accessible from the client. This may involve configuring security groups or firewall rules depending on your hosting provider.
bashsudo ufw allow 3000/tcp - 3
Update Socket.IO Client Options
Modify the Socket.IO client connection options to include the 'transports' parameter, which explicitly specifies the transport methods to be used. This can help in environments where WebSocket transport is not supported.
javascriptvar socket = io.connect(baseUrl, { 'transports': ['polling', 'websocket'], 'reconnection': true, 'reconnectionDelay': 1000, 'reconnectionDelayMax': 5000, 'forceNew': true }); - 4
Check for CORS Issues
If your client and server are on different domains, ensure that Cross-Origin Resource Sharing (CORS) is properly configured on your server to allow requests from your client domain.
javascriptconst io = require('socket.io')(server, { cors: { origin: 'http://your-client-domain.com', methods: ['GET', 'POST'], allowedHeaders: ['my-custom-header'], credentials: true } }); - 5
Test Connection Stability
After applying the above changes, test the WebSocket connection stability by monitoring the connection logs on both the client and server sides. Use tools like browser developer tools or network monitoring tools to check for any persistent issues.
javascriptconsole.log('Socket connected:', socket.connected);
Validation
To confirm the fix worked, attempt to establish a WebSocket connection from the client to the server and monitor for successful connection logs. Ensure that the connection remains stable without intermittent failures. Additionally, check for any errors in the server logs related to WebSocket connections.
Sign in to verify this fix
Environment
Submitted by
Alex Chen
2450 rep