Socket.io: gagal: Koneksi ditutup sebelum menerima respons jabat tangan

Dibuat pada 9 Mar 2015  ·  21Komentar  ·  Sumber: socketio/socket.io

Hai

Saya menggunakan socket.io dalam proyek yang dibangun di atas MEAN.IO (https://github.com/linnovate/mean) .
Saya berhasil mengintegrasikan perpustakaan, di lokal saya semuanya berfungsi dengan baik tanpa kesalahan di konsol.

tetapi saat menggunakan kode yang sama di server itu menunjukkan saya kesalahan sebagai

Koneksi WebSocket ke 'ws://ip.ip.ip.ip:3000/socket.io/?EIO=3&transport=websocket&sid=OpeM3YIJqVuTnt-dAAAY' gagal: Koneksi ditutup sebelum menerima respons jabat tangan

Saya telah memberikan opsi ke soket untuk saat ini untuk menyambung kembali sebagai: -

var socket = io.connect(baseUrl, {
'koneksi ulang': benar,
'penundaan koneksi ulang': 1000,
'reconnectionDelayMax': 5000,
'forceNew': benar
});

tapi masih beberapa kali soket tetap tidak aktif.

Handshakes

Komentar yang paling membantu

@nkzawa Saat menggunakan socket.io-redis(https://github.com/automattic/socket.io-redis), terkadang muncul pesan kesalahan sebagai berikut:

WebSocket connection to 'ws://localhost:8501/socket.io/?EIO=3&transport=websocket&sid=WPOeefk2cs-DsfLFAAAE' failed: Connection closed before receiving a handshake response

Setelah kesalahan ini terjadi, maka permintaan http akan mengembalikan 400. Url kesalahannya adalah http://localhost:8501/socket.io/?EIO=3&transport=polling&t=1425998452675-5&sid=1VwKenkSONHg6-ddAABW , pesan pengembaliannya adalah {"code":1,"message":"Session ID unknown"} . Ketika saya melihat log ditulis oleh sisi server, saya menemukan soket 1VwKenkSONHg6-ddAABW telah terputus. Dan akhirnya soket tidak dapat terhubung kembali dengan sukses, dan klien dan server tidak dapat berkomunikasi satu sama lain.

Kode yang saya gunakan:

var socketIo = require('socket.io');
var redis = require('socket.io-redis');
var socket_handler = require('./socket_handler');
var config = require('../config');
const PREFIX_SOCKET_IO = 'socketIoPrefix:';
function SocketIoApp(httpServer) {
    this.httpServer = httpServer;
}

SocketIoApp.prototype.listen = function(port) {
    var io = socketIo(this.httpServer);
    var redisConfig = config.redisConfig;
    redisConfig.key = PREFIX_SOCKET_IO;
    io.adapter(redis(redisConfig));
    this.httpServer.listen(port);

    io.on('connection', function (socket) {
        console.log('socketid',socket.id,'connected');
        socket.emit('hello','hello');
        socket.on('msg', function (data) {
            socket_handler.process(socket,data,function(err) {
               //
            });
        });
        socket.on('disconnect', function () {
            console.log(socket.id + ' disconnect');
        });
    });
    this.io = io;
}

Semua 21 komentar

Apakah Anda memiliki beberapa proses server sebagai server Anda? Dalam hal ini, Anda harus menggunakan sesi lengket.

http://socket.io/docs/using-multiple-nodes/

@nkzawa : hai terima kasih banyak telah menyebutkan ini, saya sebenarnya tahu bahwa saya menggunakan Cluster dengan nodeJs dalam mode produksi yang merusak banyak hal di server. Saya mencoba mengonfigurasi sesi lengket ( https://github.com/indutny/sticky-session ) dengan aplikasi saya seperti yang disebutkan dalam nodeJs dengan bagian kluster, yang pada akhirnya merusak soket saya dan sekarang saya mendapatkan kesalahan konsol sebagai

Gagal membuka soket pada port 5858, menunggu 1000 ms sebelum mencoba lagi
Gagal membuka soket pada port 5858, menunggu 1000 ms sebelum mencoba lagi
Gagal membuka soket pada port 5858, menunggu 1000 ms sebelum mencoba lagi
Gagal membuka soket pada port 5858, menunggu 1000 ms sebelum mencoba lagi
Gagal membuka soket pada port 5858, menunggu 1000 ms sebelum mencoba lagi

apakah Anda tahu apa yang saya lewatkan :-(

@nkzawa Saat menggunakan socket.io-redis(https://github.com/automattic/socket.io-redis), terkadang muncul pesan kesalahan sebagai berikut:

WebSocket connection to 'ws://localhost:8501/socket.io/?EIO=3&transport=websocket&sid=WPOeefk2cs-DsfLFAAAE' failed: Connection closed before receiving a handshake response

Setelah kesalahan ini terjadi, maka permintaan http akan mengembalikan 400. Url kesalahannya adalah http://localhost:8501/socket.io/?EIO=3&transport=polling&t=1425998452675-5&sid=1VwKenkSONHg6-ddAABW , pesan pengembaliannya adalah {"code":1,"message":"Session ID unknown"} . Ketika saya melihat log ditulis oleh sisi server, saya menemukan soket 1VwKenkSONHg6-ddAABW telah terputus. Dan akhirnya soket tidak dapat terhubung kembali dengan sukses, dan klien dan server tidak dapat berkomunikasi satu sama lain.

Kode yang saya gunakan:

var socketIo = require('socket.io');
var redis = require('socket.io-redis');
var socket_handler = require('./socket_handler');
var config = require('../config');
const PREFIX_SOCKET_IO = 'socketIoPrefix:';
function SocketIoApp(httpServer) {
    this.httpServer = httpServer;
}

SocketIoApp.prototype.listen = function(port) {
    var io = socketIo(this.httpServer);
    var redisConfig = config.redisConfig;
    redisConfig.key = PREFIX_SOCKET_IO;
    io.adapter(redis(redisConfig));
    this.httpServer.listen(port);

    io.on('connection', function (socket) {
        console.log('socketid',socket.id,'connected');
        socket.emit('hello','hello');
        socket.on('msg', function (data) {
            socket_handler.process(socket,data,function(err) {
               //
            });
        });
        socket.on('disconnect', function () {
            console.log(socket.id + ' disconnect');
        });
    });
    this.io = io;
}

Hai Saya juga memiliki masalah yang sama, Apakah ada solusi untuk ini ???

Apakah ini masalah yang sama?

Saya melihat banyak kesalahan, berulang setiap beberapa detik, dan aplikasi tidak berfungsi sama sekali (saya menggunakan socket.io-redis, dengan dua server websocket dan penyeimbang beban rackspace, TCP_CLIENT_FIRST)

WebSocket connection to 'ws://some.domain.com:5001/socket.io/?EIO=3&transport=websocket' failed: Connection closed before receiving a handshake response

dan saya juga memiliki log .on('connect_error', function...) di sisi klien
setiap kali kesalahan jabat tangan terjadi, saya juga mendapatkan:

Error: websocket error
    at WS.14.Transport.onError (http://192.168.1.72:9001/bower_components/socket.io-client/socket.io.js:2297:13)
    at WebSocket.19.WS.addEventListeners.ws.onerror (http://192.168.0.72:9001/bower_components/socket.io-client/socket.io.js:3436:10)

socket.io dan socket.io-client library keduanya versi 1.3.5

ada ide?

Sepertinya socket.io bertentangan saat menggunakan lebih dari 1 koneksi soket di server. Saya memiliki masalah yang sama dengan livereload.

@nkzawa sticky-session diterbitkan 2 tahun lalu. itu dapat diandalkan untuk digunakan?

sticky-session dan klon adalah cacat serius dan berbahaya karena mereka menggunakan alamat IP yang masuk untuk tujuan penyeimbangan beban dan tidak memiliki pemahaman tentang header penerusan, jadi setelah Anda siap untuk benar-benar menerapkan dalam produksi dan menjalankan server Anda di belakang beban penyeimbang seperti yang Anda ingin jalankan di beberapa mesin untuk tujuan redundansi atau hanya skala, semua proses node akan menerima alamat IP penyeimbang beban yang menyebabkan semua permintaan masuk ke satu proses.

Jadi itu bagus untuk solusi temp, tapi bukan sesuatu yang harus disarankan sebagai solusi siap produksi.

@3rd-Eden apakah Anda punya solusi di lingkungan produk atau artikel apa pun tentangnya? Terima kasih

@looping84 : Hai, Anda dapat mencoba menggunakan server Redis dengan aplikasi Anda yang membantu saya.

Sedikit terkait... cara lain Anda bisa mendapatkan string kesalahan yang sama adalah dengan menginisialisasi pustaka socket.io dua kali. Wah saya berharap saya bisa mendapatkan sepuluh menit hidup saya kembali :stuck_out_tongue: .

http://stackoverflow.com/questions/26665840/socket-io-failed-connection-closed-before-receiving-a-handshake-response

Saya berharap masalah saya sesederhana itu :( Tetap saya tidak menyalahkan orang lain selain diri saya sendiri

@eremzeit Saya berharap saya dapat memiliki 2 jam hidup saya kembali: P
Terima kasih atas arahannya. Ini memecahkan masalah.

ini berfungsi dengan baik dengan ws tetapi tidak berfungsi saat diubah ke wss.
Pesan kesalahan saya:

Koneksi WebSocket ke ' wss://iosock.dayl.toancauxanh.vn :5432/socket.io/?token=eyJ0eXAiOiJKV1QiLCJh…HA1JyERt24hP2TIa-chetqE&EIO=3&transport=websocket&socket&sid=6QW_CBRMUiQ1_handsocket ditutup respons sebelum menerima

Siapa yang membantu saya? Salam

Saya memiliki masalah yang sama, pada dasarnya menghubungkan ganda adalah penyebab kesalahan.

server.listen(8001);

/* io.listen(server);*/ <-- comment this

var listener = io.listen(server);
listener.sockets.on('connection', function(socket){
    socket.emit('message', {'message': 'hello world'});
});

Memperbaiki masalah untuk saya.

Saya juga mengalami masalah ini dan ternyata itu adalah kesalahan konfigurasi di proxy server dev webpack saya. Parameter ws: true tidak ada untuk jalur socket.io. Menambahkan parameter itu memperbaiki masalah.

Apakah Anda menambahkan ws: true di konfigurasi webpack Anda?

Saya mendapatkan kesalahan ini, pada ~ setengah dari upaya koneksi socket.io saya, ketika menjalankan aplikasi saya di sebuah cluster tanpa sesi lengket .

Klien socket.io saya dikonfigurasi dengan transports: ['websocket'] .

@nkzawa Mengingat bahwa saya hanya menggunakan transportasi websocket , saya tidak perlu sesi lengket, kan?

Apakah ada yang melihat ini? Saya mendapatkan kesalahan ini di Safari, tetapi tidak di Chrome atau Firefox. Saya menggunakan socket.io 2.0.4. Ini telah bekerja untuk waktu yang lama, dan saya pikir Safari memperbarui sesuatu. Kami juga menggunakan Amazon ALB dengan HTTP/2 untuk membantu mempersulit ini.

Safari HTTP/2 400 WebSocket is closed before the connection is established.

Dalam kasus saya, kesalahan terjadi di browserSync.
Untuk memperbaikinya, saya perlu menentukan parameter "ws: true" di opsi browserSync.

Sebagai contoh:
sinkronisasi browser({
//...beberapa pilihan,
ws: benar
})

Dalam kasus saya, saya menggunakan WebSocket mentah

Apakah halaman ini membantu?
0 / 5 - 0 peringkat