Perbedaan antara socket dan websocket?

178

Saya sedang membangun aplikasi web yang perlu berkomunikasi dengan aplikasi lain menggunakan koneksi soket. Ini adalah wilayah baru bagi saya, jadi ingin memastikan bahwa soket berbeda dari soket web . Sepertinya mereka hanya mirip secara konseptual.

Bertanya karena pada awalnya saya berencana menggunakan Django sebagai dasar untuk proyek saya, tetapi dalam pos SO yang saya tautkan di atas, menjadi sangat jelas bahwa websockets tidak mungkin (atau setidaknya tidak dapat diandalkan, bahkan dengan sesuatu seperti django-websockets ) menggunakan pengaturan Django yang disukai (Apache dengan mod_wsgi). Namun saya telah menemukan posting lain yang dengan santai mengimpor modul soket Python untuk sesuatu yang sederhana seperti meraih nama host server .

Begitu:

  • Apakah mereka benar-benar berbeda?
  • Apakah ada alasan untuk tidak menggunakan Django untuk proyek yang bergantung pada koneksi soket dengan server luar?
Jonathon
sumber

Jawaban:

141

Untuk menjawab pertanyaan Anda.

  1. Meskipun mereka mencapai (secara umum) hal-hal serupa, ya , mereka benar - benar berbeda. WebSockets biasanya dijalankan dari browser yang terhubung ke Server Aplikasi melalui protokol yang mirip dengan HTTP yang berjalan melalui TCP / IP . Jadi mereka terutama untuk Aplikasi Web yang memerlukan koneksi permanen ke servernya. Di sisi lain, soket polos lebih kuat dan generik. Mereka berjalan melalui TCP / IP tetapi mereka tidak terbatas pada browser atau protokol HTTP . Mereka dapat digunakan untuk mengimplementasikan segala jenis komunikasi.
  2. Tidak. Tidak ada alasan.
Pablo Santa Cruz
sumber
128
WebSockets tidak mirip dengan HTTP. Mereka adalah soket normal dengan beberapa framing dan jabat tangan yang kompatibel dengan HTTP. Jabat tangan yang kompatibel dengan HTTP hanya untuk memungkinkan koneksi WebSocket pada port yang sama dengan yang dijalankan server web (sehingga server web dapat meneruskannya), tetapi begitu koneksi dibuat, server web tidak berada dalam loop. WebSockets tidak terbatas pada klien browser. Lihat libwebsocket yang memiliki klien non-browser dan server.
kanaka
14
BAIK. Saya mengerti ... Karena saya tidak dapat menghapus jawaban yang diterima ini, saya dengan hormat meminta Anda untuk mengeditnya dengan informasi yang benar. Terima kasih!
Pablo Santa Cruz
2
Anda dapat membangun klien websocket dan menggunakannya di luar browser. Protokol websocket adalah HTTP 1.1 dengan koneksi yang ditingkatkan ke "websocket."
Roger F. Gay
2
@Huggie nggak. Ada sedikit pembingkaian: tools.ietf.org/html/rfc6455#section-5 (2 byte untuk pesan kecil).
kanaka
2
@NiCkNewman mungkin itu pertanyaan terpisah yang bagus. Overhead framing minimal dan tidak masalah. Masalah dengan WebSockets untuk jaringan MMO adalah dua kali lipat: itu adalah server klien saja, dan itu adalah TCP (berbasis aliran). Untuk kinerja jaringan MMO yang baik, Anda juga memerlukan jaringan peer-to-peer langsung dan Anda memerlukan datagram (latensi rendah yang konsisten lebih penting daripada menerima setiap paket). Berita baiknya adalah bahwa WebRTC DataChannel memiliki kedua properti ini sehingga akan mulai mengisi celah dan memungkinkan game AAA MMO penuh di browser.
kanaka
21

Soket web menggunakan soket dalam implementasinya. Soket web didasarkan pada protokol standar (sekarang dalam panggilan terakhir, tetapi belum final) yang mendefinisikan koneksi "jabat tangan" dan pesan "bingkai." Kedua belah pihak melalui prosedur jabat tangan untuk saling menerima koneksi dan kemudian menggunakan format pesan standar ("bingkai") untuk meneruskan pesan bolak-balik.

Saya mengembangkan kerangka kerja yang akan memungkinkan Anda untuk berkomunikasi secara langsung mesin ke mesin dengan perangkat lunak yang diinstal. Mungkin sesuai dengan tujuan Anda. Anda dapat mengikuti blog saya jika ingin: http://highlevellogic.blogspot.com/2011/09/websocket-server-demonstration_26.html

Roger F. Gay
sumber
11

Anda harus menggunakan WebSockets (atau beberapa protokol yang sama modul misalnya karena didukung oleh Flash plugin) karena aplikasi browser yang normal tidak bisa membuka TCP socket murni.

The Socket.IOmodul yang tersedia untuk node.jsdapat membantu banyak, tapi catatan bahwa tidak modul WebSocket murni dalam dirinya sendiri.

Ini sebenarnya modul komunikasi yang lebih umum yang dapat berjalan di atas berbagai protokol jaringan lainnya, termasuk WebSockets, dan soket Flash.

Oleh karena itu, jika Anda ingin menggunakan Socket.IOpada server Anda juga harus menggunakan kode dan objek klien mereka. Anda tidak dapat dengan mudah membuat WebSocketkoneksi mentah ke socket.ioserver karena Anda harus meniru protokol pesan mereka.

Alnitak
sumber
11

WebSocket hanyalah protokol tingkat aplikasi lain melalui protokol TCP, sama seperti HTTP.

Beberapa cuplikan <Spring in Action 4> yang dikutip di bawah ini, semoga dapat membantu Anda memahami WebSocket dengan lebih baik.

Dalam bentuknya yang paling sederhana, WebSocket hanyalah saluran komunikasi antara dua aplikasi (belum tentu melibatkan browser) ... Komunikasi WebSocket dapat digunakan di antara segala jenis aplikasi , tetapi penggunaan WebSocket yang paling umum adalah untuk memfasilitasi komunikasi antara aplikasi server dan aplikasi berbasis browser.

smwikipedia
sumber
2

Mengenai pertanyaan Anda (b), ketahuilah bahwa spesifikasi Websocket belum selesai. Menurut W3C :

Pelaksana harus menyadari bahwa spesifikasi ini tidak stabil.

Secara pribadi saya menganggap Websockets terlalu panjang untuk digunakan saat ini. Meskipun saya mungkin akan menemukan mereka berguna dalam satu tahun atau lebih.

Phil Hunt
sumber
Bagaimana dengan sekarang, 9 tahun kemudian?
Venryx