web-dev-qa-db-ja.com

Socket.io-失敗:ハンドシェイク応答を受信する前に接続が閉じられました

NodeJSのSocket.ioはwebsocketサーバーとして動作しないようです

何らかの理由で、socket.ioは常に長いポーリングにフォールバックし、websocketトランスポート層を強制すると、エラーになります:

失敗:ハンドシェイク応答を受信する前に接続が閉じられました

適切なポートが開いています。 socket.ioの チャットの例 を使用しています。 http://jmi.io:30 でサーバーをセットアップしました。あなたが見ることができるように、それは美しい長いポーリングチャンネルでうまく動作しますが、今ではwebsocketクライアントからwebsocket接続を試してみてください...

「ws:// jmi:3000 /」へのWebSocket接続に失敗しました:ハンドシェイク応答を受信する前に接続が閉じられました

私はシングルスレッドのノードを1つしか持っておらず、チャットの例のリポジトリとまったく同じpackage.jsonを持っています。

{
  "name": "socket-chat-example",
  "version": "0.0.1",
  "description": "my first socket.io app",
  "dependencies": {
    "express": "4.3.1",
    "socket.io": "1.2.0"
  }
}

ご協力ありがとうございました

20
Jean Meyer

「io」を2回定義していたため、まったく同じ問題が発生しました。コード内でioを定義している場所を再確認し、変数ioを2回定義していないことを確認します。

私が間違っていたことの例:

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

問題を修正した例:

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

@Lucas Klaassenが答えたことに少し関連しました:私は次のことをしました:

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

最後の行を変更すると、それが修正されました:

http.listen(port);
5
Andy

私の場合、問題はbrowser-syncを介してサーバーをプロキシしていることでした

browserSync({
    //server: {
    //  // src is included for use with sass source maps
    //  baseDir: ['public', 'src']
    //},
    proxy: "localhost:4045",
    port: 4046

したがって、これは失敗しますが、実稼働環境では正常に機能します。

4
Jamie Hutber

作業プロジェクトの1つからの完全な作業例は次のとおりです。

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

メディアからの翻訳

0
student