Socket.io-client: Bawa default ke polling alih-alih websocket?

Dibuat pada 11 Sep 2015  ·  9Komentar  ·  Sumber: socketio/socket.io-client

Baris 1613 dari socket.io.js berbunyi:
this.transports = opts.transports || ['jajak pendapat', 'websocket'];

Mengapa pesanan tidak ['websocket', 'polling']?

Di sisi klien yang saya lakukan:
var socket = io.connect(url);

Kemudian di sisi server, saya melakukan:
io.on('koneksi', fungsi(soket){
console.log(soket);
});

Bagian jabat tangan terlihat seperti:

handshake: 
   { headers: 
      { 'user-agent': 'node-XMLHttpRequest',
        accept: '*/*',
        host: 'localhost:8081',
        connection: 'close' },
     time: 'Fri Sep 11 2015 16:04:39 GMT-0400 (EDT)',
     address: '::ffff:127.0.0.1',
     xdomain: false,
     secure: false,
     issued: 1442001879771,
     url: '/socket.io/?EIO=3&transport=polling&t=1442001879749-0&b64=1',
     query: { EIO: '3', transport: 'polling', t: '1442001879749-0', b64: '1' } }

Apakah ini berarti menggunakan polling alih-alih websocket?

Saya mencoba mengatur transport ke 'websocket' secara eksplisit, dan bagian jabat tangan berubah menjadi yang berikut yang tampaknya benar:
var socket = io.connect(url,{transports:['websocket']});

handshake: 
   { headers: 
      { connection: 'Upgrade',
        upgrade: 'websocket',
        host: 'localhost:8081',
        origin: 'localhost:8081',
        'sec-websocket-version': '13',
        'sec-websocket-key': 'MTMtMTQ0MjAwMTUxNDcyNA==' },
     time: 'Fri Sep 11 2015 15:58:34 GMT-0400 (EDT)',
     address: '::ffff:127.0.0.1',
     xdomain: true,
     secure: false,
     issued: 1442001514739,
     url: '/socket.io/?EIO=3&transport=websocket',
     query: { EIO: '3', transport: 'websocket' } }

Komentar yang paling membantu

+1
Saya lebih suka ide "downgrade" daripada "upgrade". Saat ini sebagian besar browser mendukung websocket dengan baik. Awalnya menghubungkan dengan websocket akan meningkatkan kinerja dan menghemat sumber daya.

Semua 9 komentar

+1
Saya lebih suka ide "downgrade" daripada "upgrade". Saat ini sebagian besar browser mendukung websocket dengan baik. Awalnya menghubungkan dengan websocket akan meningkatkan kinerja dan menghemat sumber daya.

Alasan upgrade adalah sebagai berikut.

Socket.IO tidak pernah berasumsi bahwa WebSocket hanya akan berfungsi, karena dalam praktiknya ada kemungkinan besar bahwa itu tidak akan berfungsi. Sebagai gantinya, itu membuat koneksi dengan XHR atau JSONP segera, dan kemudian mencoba untuk memutakhirkan koneksi ke WebSocket. Dibandingkan dengan metode fallback yang mengandalkan waktu tunggu, ini berarti tidak ada pengguna Anda yang akan mengalami penurunan pengalaman.

http://socket.io/blog/introducing-socket-io-1-0/

@nkzawa
Saya mengerti mengapa pendekatan peningkatan lebih disukai, dan ini adalah fitur yang sangat bagus.
Tetapi itu tidak selalu diperlukan: di lingkungan perusahaan yang terkendali, pendekatan penurunan versi lebih masuk akal, dan saya akan mengatakan bahwa memaksa soket web sebagai satu-satunya transportasi yang diizinkan adalah cara terbaik untuk mengoptimalkan kinerja.

Saya mencoba memaksa transportasi ke soket web baik di klien dan server dengan melewati opsi ini:
{ transports: ["websocket"] }

Ini tampaknya berfungsi dan saya hanya memiliki satu koneksi soket web ke server, tetapi saya perhatikan bahwa polling juga sedang dilakukan yang jelas-jelas gagal pada setiap percobaan:
Request URL:http://localhost:4000/socket.io/?EIO=3&transport=polling&t=L8RaD0p
{ code: 0, message: "Transport unknown" }

Apakah ada solusi yang layak saat ini untuk mengubah pendekatan peningkatan ini menjadi penurunan versi?

Sudahlah, itu adalah kode saya yang melakukan polling tambahan dari kelas yang berbeda di mana saya juga menggunakan socket.io. Jadi menggunakan opts yang membatasi transport ke websocket ketika saya terhubung melakukan apa yang saya inginkan.

@sirudog
Anda dapat mencoba ini: { transports: ['websocket', 'polling'] }

Terima kasih @poppowerlb2 (tidak ada lagi lalu lintas seperti dia di tab jaringan saya). Bahkan jika browser saya mutakhir, saya melihat bahwa socket-io-client lebih memilih polling.

Bukankah pendekatan pemutakhiran ini mengecualikan beberapa server? Saya mencoba menggunakan socket.io dengan server node-red dan saya belum dapat membuat koneksi. Tentu saja, ini berfungsi dengan baik dengan soket web biasa.

Saya juga berpikir lebih baik socket.io mencoba soket web meskipun polling tidak berhasil.

+1
Saya lebih suka ide "downgrade" daripada "upgrade". Saat ini sebagian besar browser mendukung websocket dengan baik. Awalnya menghubungkan dengan websocket akan meningkatkan kinerja dan menghemat sumber daya.

`
const client = io('https://io.yourhost.com', { // PERINGATAN: dalam hal ini, tidak ada fallback ke transportasi polling panjang: [ 'websocket' ] // atau [ 'websocket', ' polling' ], yang merupakan hal yang sama})

https://socket.io/docs/using-multiple-nodes/
`

Apakah halaman ini membantu?
0 / 5 - 0 peringkat