Differenza tra socket e websocket?


178

Sto creando un'app Web che deve comunicare con un'altra applicazione utilizzando le connessioni socket. Questo è un nuovo territorio per me, quindi voglio essere sicuro che i socket siano diversi dai websocket . Sembra che siano concettualmente simili.

Chiedere perché inizialmente avevo pianificato di usare Django come base per il mio progetto, ma nel post SO che ho collegato sopra è stato chiarito che i websocket non sono possibili (o almeno non affidabili, anche con qualcosa come django-websocket ) usando la configurazione Django preferita (Apache con mod_wsgi). Eppure ho trovato altri post che importano casualmente il modulo socket di Python per qualcosa di semplice come afferrare il nome host del server .

Così:

  • Sono davvero diversi?
  • C'è qualche motivo per non usare Django per un progetto che si basa sullo stabilire connessioni socket con un server esterno?

Risposte:


141

Per rispondere alle tue domande.

  1. Anche se raggiungono (in generale) cose simili, , sono davvero diverse. I WebSocket vengono in genere eseguiti da browser che si connettono ad Application Server su un protocollo simile a HTTP che funziona su TCP / IP . Quindi sono principalmente per applicazioni Web che richiedono una connessione permanente al suo server. D'altra parte, le prese semplici sono più potenti e generiche. Funzionano su TCP / IP ma non sono limitati a browser o protocollo HTTP . Potrebbero essere utilizzati per implementare qualsiasi tipo di comunicazione.
  2. No. Non c'è motivo.

128
WebSocket non sono simili a HTTP. Sono normali socket con alcuni frame e una stretta di mano compatibile con HTTP. L'handshake compatibile con HTTP è solo per consentire la connessione WebSocket sulla stessa porta su cui è in esecuzione un server Web (in modo che il server Web possa inoltrarli), ma una volta stabilita la connessione, il server Web non è nel ciclo. WebSocket non è limitato ai client browser. Vedi libwebsocket che ha sia un client non browser che un server.
Kanaka,

14
OK. Vedo ... Dal momento che non riesco a eliminare questa risposta accettata, ti chiedo gentilmente di modificarla con le informazioni corrette. Grazie!
Pablo Santa Cruz,

2
È possibile creare client WebSocket e utilizzarli al di fuori dei browser. Il protocollo websocket è HTTP 1.1 con una connessione aggiornata a "websocket".
Roger F. Gay,

2
@huggie no. C'è un po 'di framing: tools.ietf.org/html/rfc6455#section-5 (2 byte per piccoli messaggi).
Kanaka,

2
@NiCkNewman è probabilmente una buona domanda separata in realtà. Il sovraccarico dell'inquadratura è minimo e non è un problema. Il problema con WebSocket per la rete MMO è duplice: è solo un server client ed è TCP (basato su stream). Per ottenere buone prestazioni di rete MMO è anche necessaria una rete peer-to-peer diretta e sono necessari datagrammi (una bassa latenza costante è più importante della ricezione di ogni pacchetto). La buona notizia è che WebRTC DataChannel ha entrambe queste proprietà, quindi inizierà a colmare il vuoto e consentire il gioco MMO AAA completo nel browser.
Kanaka,

21

I websocket utilizzano i socket nella loro implementazione. I websocket si basano su un protocollo standard (ora nella chiamata finale, ma non ancora finale) che definisce una connessione "stretta di mano" e un messaggio "frame". Le due parti passano attraverso la procedura di stretta di mano per accettare reciprocamente una connessione e quindi utilizzare il formato di messaggio standard ("frame") per passare i messaggi avanti e indietro.

Sto sviluppando un framework che ti permetterà di comunicare direttamente da macchina a macchina con il software installato. Potrebbe soddisfare il tuo scopo. Puoi seguire il mio blog se lo desideri: http://highlevellogic.blogspot.com/2011/09/websocket-server-demonstration_26.html


11

Dovresti usare WebSocket (o alcuni modulo di protocollo simile, ad esempio come supportato dal plug-in Flash) perché una normale applicazione browser semplicemente non può aprire un socket TCP puro.

Il Socket.IOmodulo disponibile per node.jspuò aiutare molto, ma nota che è non è un modulo WebSocket puro a sé stante.

In realtà è un modulo di comunicazione più generico che può essere eseguito su vari altri protocolli di rete, inclusi WebSocket e Flash.

Pertanto, se si desidera utilizzare Socket.IOsul lato server, è necessario utilizzare anche il codice client e gli oggetti. Non è possibile effettuare facilmente WebSocketconnessioni non elaborate a un socket.ioserver in quanto si dovrebbe emulare il loro protocollo di messaggi.


11

WebSocket è solo un altro protocollo a livello di applicazione su protocollo TCP, proprio come HTTP.

Alcuni frammenti <Spring in Action 4> citati di seguito, spero che possano aiutarti a capire meglio WebSocket.

Nella sua forma più semplice, un WebSocket è solo un canale di comunicazione tra due applicazioni (non è necessariamente coinvolto un browser) ... La comunicazione WebSocket può essere utilizzata tra qualsiasi tipo di applicazione , ma l'uso più comune di WebSocket è facilitare la comunicazione tra un applicazione server e un'applicazione basata su browser.


2

Per quanto riguarda la tua domanda (b), tieni presente che le specifiche di Websocket non sono state finalizzate. Secondo il W3C :

Gli implementatori devono essere consapevoli che questa specifica non è stabile.

Personalmente ritengo che i Websocket siano troppo deboli per essere utilizzati al momento. Anche se probabilmente li troverò utili tra circa un anno.


E adesso, 9 anni dopo?
Venryx,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.