web-dev-qa-db-fra.com

Socket.io - Failed: connexion fermée avant de recevoir une réponse de prise de contact

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

19
Jean Meyer

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'));
});
28
jetset

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.

4
Jamie Hutber

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);
3
Andy

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');
});

traduit de Medium

0
student