node.js - error - this socket on
Socket.io: falla: la conexión se cerró antes de recibir una respuesta de saludo (4)
Aquí está el ejemplo completo de trabajo de uno de nuestros proyectos de trabajo:
const websocket = require(''ws'');
const http = require(''http'');
const express = require(''express'');
const app = express();
const server = http.createServer(app);
wss = new websocket.Server({ server });
app.on(''upgrade'', wss.handleUpgrade);
wss.on(''connection'', ws => {
console.log(''web socket connection is alive'');
}
server.listen(8080, () => {
console.log(''server started on PORT 8080'');
});
Socket.io para NodeJS no parece funcionar como un servidor websocket
Por alguna razón, socket.io SIEMPRE retrocede al sondeo largo y, si fuerzo la capa de transporte websocket, se producirá un error:
fallido: conexión cerrada antes de recibir una respuesta de saludo
Los puertos correctos están abiertos. Estoy usando el ejemplo de chat de socket.io. Configuré el servidor en http://jmi.io:3000 . Como puede ver, funciona bien con un hermoso canal de sondeo largo, pero ahora intente la conexión websocket desde un cliente websocket y ...
La conexión de WebSocket a ''ws: // jmi: 3000 /'' falló: la conexión se cerró antes de recibir una respuesta de saludo
Solo tengo un nodo con un único subproceso y tengo exactamente el mismo package.json que en el ejemplo de ejemplo de chat.
{
"name": "socket-chat-example",
"version": "0.0.1",
"description": "my first socket.io app",
"dependencies": {
"express": "4.3.1",
"socket.io": "1.2.0"
}
}
Gracias por tu ayuda
En mi caso, el problema fue que estoy procesando el servidor a través browser-sync
browserSync({
//server: {
// // src is included for use with sass source maps
// baseDir: [''public'', ''src'']
//},
proxy: "localhost:4045",
port: 4046
Así que esto fallará, sin embargo en la producción funciona bien.
Ligeramente relacionado con lo que respondió @Lucas Klaassen: Tuve lo siguiente:
let express = require(''express'');
let app = express();
let http = require(''http'').Server(app);
let io = require(''socket.io'')(http);
// this is the culprit:
app.listen(port);
Cambiar la última línea es lo que lo arregló:
http.listen(port);
Tuve exactamente el mismo problema porque estaba definiendo ''io'' dos veces. Verifique dónde está definiendo io en su código y asegúrese de que no está definiendo la variable io dos veces.
Ejemplo de lo que estaba haciendo mal:
var server = require(''http'').createServer(app);
var io = require(''socket.io'')(server);
var io = require(''socket.io'').listen(server.listen(config.port, config.ip, function () {
console.log(''Express server listening on %d, in %s mode'', config.port,
app.get(''env''));
}));
Ejemplo de lo que solucionó el problema:
var server = require(''http'').createServer(app);
var io = require(''socket.io'')(server);
server.listen(config.port, config.ip, function () {
console.log(''Express server listening on %d, in %s mode'', config.port,
app.get(''env''));
});