Socket.io pour NodeJS ne semble pas fonctionner comme un serveur websocket
Pour une raison quelconque, socket.io TOUJOURS revenir à la longue interrogation et si je force le calque de transport websocket, il obtiendra une erreur:
Échec: connexion fermée avant de recevoir une réponse de prise de contact.
Les bons ports sont ouverts. J'utilise le exemple de conversation de socket.io . J'ai configuré le serveur sur http://jmi.io:3000 . Comme vous pouvez le constater, cela fonctionne bien avec un beau long canal d'interrogation, mais essayez maintenant la connexion websocket depuis un client websocket et ...
La connexion WebSocket à 'ws: // jmi: 3000 /' a échoué: la connexion a été fermée avant de recevoir une réponse de prise de contact.
Je n'ai qu'un seul nœud et j'ai exactement le même package.json que dans l'exemple de discussion.
{
"name": "socket-chat-example",
"version": "0.0.1",
"description": "my first socket.io app",
"dependencies": {
"express": "4.3.1",
"socket.io": "1.2.0"
}
}
Merci de votre aide
J'ai eu exactement le même problème parce que je définissais deux fois «io». Vérifiez à nouveau où vous définissez io dans votre code et assurez-vous de ne pas définir la variable io deux fois.
Exemple de ce que je faisais 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'));
}));
Exemple de ce qui a résolu le problème:
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'));
});
Dans mon cas, le problème était que je mandatais le serveur via browser-sync
browserSync({
//server: {
// // src is included for use with sass source maps
// baseDir: ['public', 'src']
//},
proxy: "localhost:4045",
port: 4046
Donc, cela va échouer, mais en production cela fonctionne bien.
Légèrement lié à ce que @Lucas Klaassen a répondu: J'ai eu ce qui suit:
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);
Changer la dernière ligne est ce qui l'a corrigé:
http.listen(port);
Voici l'exemple complet de l'un de nos projets:
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');
});