Socket.io: mengapa socket.io menggunakan koneksi websocket dan polling xhr paralel?

Dibuat pada 12 Agu 2012  ·  45Komentar  ·  Sumber: socketio/socket.io

Hai,

Saya baru mengenal socket.io dan bertanya-tanya mengapa socket.io menyimpan dua koneksi:

  1. soket web
  2. Jajak Pendapat XHR

pada waktu bersamaan?

Bukankah ini agak bodoh?

Komentar yang paling membantu

@rohittailor : Saya sedang menguji ini pada klien:

    <script src="/socket.io/socket.io.js"></script>
    <script>
        var socket = io.connect({transports: ['websocket']});
    </script>

dan sejauh ini bagus. Ini benar-benar menghindari koneksi XHR.

Semua 45 komentar

  • "XHR polling" bukan koneksi, bisa menggunakan lebih dari satu koneksi.
  • Websocket dan transportasi polling belum diinisialisasi secara bersamaan. Faktanya, itulah yang dilakukan engine.io dan apa yang akan segera dilakukan socket.io setelah mengimplementasikannya. Baca lebih lanjut di sini dan Anda mungkin mempertimbangkan kembali label "bodoh", mungkin.

Jika Anda menghadapi situasi di mana socket.io 0.9 memiliki dua transpor terbuka secara bersamaan, itu akan menjadi bug, dan informasi lebih lanjut tentang cara mereproduksinya akan dihargai.

"XHR polling" bukan koneksi, bisa menggunakan lebih dari satu koneksi.

Ya, tetapi karena polling bekerja pada url yang sama semua permintaan. Saya berasumsi itu harus meniru satu.

Jika Anda menghadapi situasi di mana socket.io 0.9 memiliki dua transpor terbuka secara bersamaan, itu akan menjadi bug, dan informasi lebih lanjut tentang cara mereproduksinya akan dihargai.

Saya tidak yakin apakah maksud kami sama tetapi: Chromium menunjukkan kepada saya koneksi websocket terbuka dan selain itu ia mengirimkan permintaan polling ke socket.io.
"Bodoh" sekarang berarti bahwa saya tidak dapat mengikuti manfaat dari koneksi dan polling websocket yang dapat digunakan.
Bukankah koneksi websocket itu sendiri sudah cukup dan polling xhr hanya digunakan sebagai fallback?

Koreksi saya jika saya melewatkan sesuatu

@bodokaiser apakah koneksi websocket benar-benar berfungsi atau mundur ke polling?

Perlu diingat, jabat tangan adalah HTTP biasa

Chrome Menunjukkan kepada saya bahwa koneksi websocket tertunda. Tidak ada pesan kesalahan. Saya berasumsi bahwa ws berfungsi. Namun demikian, bagaimana saya bisa memeriksa apakah socket.io jatuh kembali?

Ya, itu jelas bukan jabat tangan. Saya melihat di chrome dan di konsol node bagaimana permintaan get diulang setiap 2000 ms.

Akankah logging node.js membantu Anda?

Salam

Periksa bingkai yang dipertukarkan dalam koneksi ws (saya pikir hanya Chrome yang memiliki ini). Jika Anda tidak melihat data, maka itu tidak berhasil.

Yap tampaknya akan mundur:

  debug - client authorized
   info  - handshake authorized yUEmr7drZfmWzWHdEZcp
GET /socket.io/1/?t=1344799805756 200 3ms
   debug - setting request GET /socket.io/1/xhr-polling/yUEmr7drZfmWzWHdEZcp?t=1344799815866
   debug - setting poll timeout
   debug - client authorized for 
   debug - clearing poll timeout
   debug - xhr-polling writing 1::
   debug - set close timeout for client yUEmr7drZfmWzWHdEZcp
GET /socket.io/1/xhr-polling/yUEmr7drZfmWzWHdEZcp?t=1344799815866 200 1ms
   debug - xhr-polling received data packet 5:::{"name":"hello","args":["world"]}
POST /socket.io/1/xhr-polling/yUEmr7drZfmWzWHdEZcp?t=1344799815871 200 1ms
   debug - setting request GET /socket.io/1/xhr-polling/yUEmr7drZfmWzWHdEZcp?t=1344799815872
   debug - setting poll timeout
   debug - discarding transport
   debug - cleared close timeout for client yUEmr7drZfmWzWHdEZcp
   debug - clearing poll timeout
   debug - xhr-polling writing 8::
   debug - set close timeout for client T9eCOR7gCe3pLNtiEZco
   debug - xhr-polling closed due to exceeded duration
GET /socket.io/1/xhr-polling/T9eCOR7gCe3pLNtiEZco?t=1344799800945 200 20002ms
   debug - clearing poll timeout
   debug - xhr-polling writing 8::
   debug - set close timeout for client yUEmr7drZfmWzWHdEZcp
   debug - xhr-polling closed due to exceeded duration

@guille dapatkah Anda memberi tahu saya mengapa ini mundur?

Peramban apa yang Anda gunakan?

Chroms 21 untuk Mac OSX

Saya juga melihat masalah yang sama di Chrome 21/Windows 21.0.1180.79 m -- ada sambungan polling JSONP (yang tampaknya berhasil) dengan sambungan WebSocket simultan yang tidak pernah tersambung -- selalu dalam status "Tertunda". Versi Chrome yang sama di Mac tampaknya baik-baik saja.

Ini sepertinya tidak terkait firewall atau antivirus, semua tes lulus di websocketstest.org dan websocket.org/echo.html.

Saya menggunakan socket.io 0.9, tetapi tampaknya juga hadir di versi terbaru.

@guille Masalah ini tampaknya cukup mudah untuk direproduksi juga. Saya baru saja mengunjungi situs yang menggunakan transportasi WebSocket socket.io:

http://beta.blaggart.com

Perhatikan bahwa, di Chrome 21 pada Windows setidaknya, status koneksi WS selalu "Tertunda."

Coba dengan socket.io master ?

Baru saja mencoba master dan saya memiliki masalah yang sama. Pikirkan masalah ini mungkin juga merupakan penipuan #998.

Juga, untuk apa nilainya, solusi yang dijelaskan di #998 berhasil bagi saya dalam mendapatkan koneksi untuk dibuat -- menonaktifkan soket web dan hanya menggunakan polling xhr dan jsonp.

apakah ini benar-benar bug chrome?

saat melakukan tes di www.websocket.org/echo.html

Lucunya adalah ketika saya menggunakan "WebSocket aman (TLS)" di situs web yang sama maka websocket berfungsi.

perilaku yang sama persis untuk Chrome dan Firefox.. sangat aneh..

Server:

socket.on('loginout',function(){
    socket.emit('loginout',{uname:socket.name});
});

socket.on('login',fungsi(data){
socket.emit('l_msg',{uname:data.uname,score:data.score,type:true});
});

Mencetak:
info: jabat tangan resmi 11012331592122282453
debug: mengatur permintaan GET /socket.io/1/xhr-polling/11012331592122282453?t=1353485202761
debug: mengatur batas waktu polling
debug: klien diotorisasi untuk
debug: menghapus batas waktu polling
debug: tulisan polling xhr 1::
debug: setel batas waktu tutup untuk klien 11012331592122282453
debug: xhr-polling menerima paket data 20 5:::{"name":"count"} 22 5:::{"name":"history"} 23 5:::{"name ":"Daftar pengguna"}
debug: mengatur permintaan GET /socket.io/1/xhr-polling/11012331592122282453?t=1353485202792
debug: mengatur batas waktu polling
debug: membuang transportasi
debug: menghapus batas waktu tutup untuk klien 11012331592122282453
debug: menghapus batas waktu polling
debug: tulisan polling xhr 8::
debug: setel batas waktu tutup untuk klien 1896586469607627233
debug: polling xhr ditutup karena durasi yang terlampaui
debug: xhr-polling menerima paket data 5:::{"name":"login","args":[{"uname":"gjjn","pwd":"3f01728152a0225ff9806c401ffdbe77"}]}
debug: menghapus batas waktu polling
debug: xhr-polling menulis 5:::{"name":"l_msg","args":[{"uname":"gjjn","type":true,"head":" http://42.121. 14.234/tidak ditentukan "}]}
debug: setel batas waktu tutup untuk klien 11012331592122282453
debug: xhr-polling menerima paket data 5:::{"name":"loginout"}
debug: penulisan soket web 5:::{"name":"l_msg","args":[{"uname":"gregergre","type":true,"head":" http://42.121.14.234/ tidak ditentukan "}]}
debug: memancarkan detak jantung untuk klien 5207531891749391108
debug: penulisan websocket 2::
debug: setel batas waktu detak jantung untuk klien 5207531891749391108
debug: dapatkan paket detak jantung
debug: menghapus batas waktu detak jantung untuk klien 5207531891749391108
debug: atur interval detak jantung untuk klien 5207531891749391108
debug: penulisan websocket 5:::{"name":"loginout","args":[{}]}

Polling xhr menerima paket data 5:::{"name":"loginout"}.
Tapi tidak Hasil.

Hal yang sama di sini. Saya menggunakan kode yang sama tetapi berfungsi di Chrome MacOS tetapi tidak di Chrome Windows

+1, tolong perbaiki masalah ini.. @LearnBoost

Bahkan saya melihat ini, pada akhirnya saya melihat sebagai koneksi Websocket dan permintaan XHR berulang yang dikirim ke server SOCKET.io

Sepertinya koneksi websocket berhasil namun saya melihat permintaan XHR

Request URL:ws://localhost:5000/socket.io/?EIO=2&transport=websocket&sid=XcMblHoZ0x97QRn_AAAE
Request Method:GET
Status Code:101 Switching Protocols
Request Headers CAUTION: Provisional headers are shown.
Cache-Control:no-cache
Connection:Upgrade
Cookie:io=XcMblHoZ0x97QRn_AAAE
Host:localhost:5000
Origin:http://localhost:3000
Pragma:no-cache
Sec-WebSocket-Extensions:permessage-deflate; client_max_window_bits, x-webkit-deflate-frame
Sec-WebSocket-Key:EZixwYoUHpFFpgrEOqiS+w==
Sec-WebSocket-Version:13
Upgrade:websocket
User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.153 Safari/537.36
Query String Parametersview sourceview URL encoded
EIO:2
transport:websocket
sid:XcMblHoZ0x97QRn_AAAE
Response Headers
Connection:Upgrade
Sec-WebSocket-Accept:WHsiBZoW9stmULt+YX8wmNK1wx8=
Upgrade:websocket

Berikut bagaimana bingkai websocket terlihat seperti
https://www.dropbox.com/s/v6szg9hka53erbc/Screenshot%202014-07-09%2011.12.33.png

Dan Permintaan Polling Panjang

https://www.dropbox.com/s/pf7d56tp85864bg/Screenshot%202014-07-09%2011.15.47.png

Saya Menjalankan di Google Chrome 35.0.1916.153

dan versi masalah soket adalah [email protected]

Saya memiliki masalah yang sama. Ada pembaruan? Menggunakan SocketIO 1.0.6

Permintaan pertama selalu XHR, lalu kita _upgrade_ ke WebSocket (jika bisa). Polling berikutnya dibatalkan (mungkin ada siklus polling tambahan dalam beberapa kasus, tetapi tidak pernah lebih dari 1)

@guille untuk apa yang saya periksa, saya melihat polling XHR berulang bahkan jika koneksi Websocket berhasil dibuat

Hai,

Apa solusi untuk mengatasi masalah ini?

@rohittailor : Saya sedang menguji ini pada klien:

    <script src="/socket.io/socket.io.js"></script>
    <script>
        var socket = io.connect({transports: ['websocket']});
    </script>

dan sejauh ini bagus. Ini benar-benar menghindari koneksi XHR.

Ini menyelesaikan masalah saya juga, websocket berfungsi dengan baik TETAPI ada juga polling XHR yang kotor. Terima kasih @gonzalodiaz

Saya benar-benar ingin melihat skenario di mana ia berhasil meningkatkan ke WS tetapi siklus pemungutan suara XHR berlanjut tanpa batas di Web Inspector!

(demo, video, gif animasi, apa pun berfungsi)

Saya dapat memberi Anda akses demo ke situs web saya, yang dihosting di cloud MS Azure besok. Bisakah Anda memberi kami URL pengujian Anda dan detail lebih lanjut tentang bagaimana socket.io dihosting?

@guille Bagaimana ini?

Berikut bagaimana bingkai websocket terlihat seperti
https://www.dropbox.com/s/v6szg9hka53erbc/Screenshot%202014-07-09%2011.12.33.png

Dan Permintaan Polling Panjang

https://www.dropbox.com/s/pf7d56tp85864bg/Screenshot%202014-07-09%2011.15.47.png

Apakah itu terus berlanjut tanpa batas? Apakah ada bingkai duplikat di
tanggapan? Bisakah Anda memposting log server yang sesuai dengan DEBUG=* dan
log browser dengan localStorage.debug='*' ketika situasi ini terjadi?


Guillermo Rauch – @rauchg https://twitter.com/rauchg

Pada Tue, 14 Oktober 2014 di 10:59, Viren Negi [email protected]
menulis:

@guille https://github.com/guille Bagaimana dengan ini

Berikut bagaimana bingkai websocket terlihat seperti

https://www.dropbox.com/s/v6szg9hka53erbc/Screenshot%202014-07-09%2011.12.33.png

Dan Permintaan Polling Panjang

https://www.dropbox.com/s/pf7d56tp85864bg/Screenshot%202014-07-09%2011.15.47.png


Balas email ini secara langsung atau lihat di GitHub
https://github.com/Automattic/socket.io/issues/991#issuecomment -59161273
.

@guille Saya melihat respons xhr berulang tanpa batas tidak yakin tentang bingkai duplikat, biarkan saya melihat Jika saya dapat memberikan semua yang Anda butuhkan

Tidak yakin seberapa membantu saya, tetapi saya perhatikan bahwa saya hanya dapat terhubung ke soket web jika aman. Apakah ada beberapa perubahan keamanan baru-baru ini yang memerlukan tajuk (seperti CORS) untuk memungkinkan koneksi WebSocket yang tidak aman?

WebSockets bekerja sebulan yang lalu untuk saya, sekarang hanya berfungsi untuk koneksi wss://.
Chrome 38.0.2125.104 - Windows 8.1.1

Sunting: Hasil ini mungkin sebenarnya menjadi masalah dengan http://www.websocket.org/echo.html
Saya tidak dapat menguji di tempat lain

Keberhasilan koneksi WS sangat tergantung pada kemampuan jaringan/server. SSL menjamin tidak ada yang dapat merusaknya sebelum data didekripsi (proxy/penyeimbang beban berikutnya masih dapat merusaknya).

Saya perhatikan bahwa itu sebenarnya adalah bug dalam kode, bahkan tidak pernah memeriksa koneksi WS, saya membuat perubahan dan kemudian berhasil. Jika saya ingat saya akan melihat sumber yang dimodifikasi malam ini.

Tetapi jika itu berfungsi untuk semua orang, mungkin ada hal lain yang salah dengan pengaturan saya, tetapi itu tidak mencoba untuk terhubung karena dianggap bahwa WS tidak tersedia tanpa mencoba, mengubah && menjadi || memperbaikinya.

Saya ingin mendengar lebih banyak!

Masih masalah (kecil), klien selalu membuat permintaan polling daripada mencoba transportasi lain. Saya harus menentukan

{transports: ['websocket']}

Untuk membuatnya berfungsi, tetapi klien harus mencoba semua transportasi untuk menemukan yang bagus, bukan?

Masalah ini adalah alasan mengapa saya mulai kembali pada 2012/13 untuk mengerjakan paket soket web "murni" sendiri.

Apakah masalah ini sudah terpecahkan? Saya melihat sesuatu yang serupa, tetapi sebelum saya mulai menggali lebih dalam, saya ingin melakukan pencarian cepat... komentar?

Kode telah berubah sedikit sejak saya terakhir mengomentari masalah ini. Tidak mungkin itu bug yang sama. Sepertinya saya tidak dapat menemukan baris yang saya duga menyebabkan masalah terakhir kali. Itu bukan untuk mengatakan itu sudah diperbaiki.

Kode socket.io saya saat ini diblokir oleh bug engine.io-client jadi saya sudah tidak menggunakan s.io selama beberapa bulan sekarang jadi tidak bisa mengatakan dengan pasti apakah ini masih menjadi masalah.

@nevercast komentar Anda tentang wss berfungsi tetapi ws tidak sepenuhnya benar dalam kasus saya. Terima kasih telah menunjukkannya. Saya telah mencari masalah ini selama lebih dari seminggu. Menemukan bahwa entah bagaimana koneksi ws di jaringan saya diblokir tetapi wss berfungsi dengan baik.

Situs web ini sangat bagus: http://websocketstest.com/ memberi tahu Anda port mana yang dapat menjalankan soket web di jaringan mana pun. Sarankan untuk memeriksa ini sebelum terlalu terlibat dalam debugging websocket.

saya memiliki masalah dengan soket io tetapi tidak yakin di mana saya salah.
image

gambar di atas menunjukkan bahwa itu berfungsi dengan baik di lokal tetapi gambar di bawah ini diambil saat mencoba di lingkungan AWS.

image

saya memiliki masalah dengan soket io tetapi tidak yakin di mana saya salah.
image

gambar di atas menunjukkan bahwa itu berfungsi dengan baik di lokal tetapi gambar di bawah ini diambil saat mencoba di lingkungan AWS.

image

menghadapi masalah yang sama

Apakah halaman ini membantu?
0 / 5 - 0 peringkat