¿Diferencia entre socket y websocket?

178

Estoy creando una aplicación web que necesita comunicarse con otra aplicación mediante conexiones de socket. Este es un territorio nuevo para mí, así que quiero estar seguro de que los sockets son diferentes a los sockets web . Parece que solo son conceptualmente similares.

Preguntando porque inicialmente había planeado usar Django como la base de mi proyecto, pero en la publicación SO a la que me vinculé anteriormente, queda muy claro que los websockets no son posibles (o al menos no son confiables, incluso con algo como django-websockets) ) utilizando la configuración preferida de Django (Apache con mod_wsgi). Sin embargo, he encontrado otras publicaciones que importan casualmente el módulo de socket de Python por algo tan simple como tomar el nombre de host del servidor .

Entonces:

  • ¿Son realmente diferentes?
  • ¿Hay alguna razón para no usar Django para un proyecto que se basa en establecer conexiones de socket con un servidor externo?
Jonathon
fuente

Respuestas:

141

Para responder tu pregunta.

  1. Aunque logran (en general) cosas similares, , son realmente diferentes. Los WebSockets generalmente se ejecutan desde navegadores que se conectan a Application Server a través de un protocolo similar a HTTP que se ejecuta sobre TCP / IP . Por lo tanto, son principalmente para aplicaciones web que requieren una conexión permanente a su servidor. Por otro lado, los enchufes simples son más potentes y genéricos. Se ejecutan sobre TCP / IP pero no están restringidos a los navegadores o al protocolo HTTP . Podrían usarse para implementar cualquier tipo de comunicación.
  2. No. No hay razón.
Pablo Santa Cruz
fuente
128
WebSockets no son similares a HTTP. Son enchufes normales con algunos marcos y un protocolo de enlace compatible con HTTP. El protocolo de enlace compatible con HTTP es solo para permitir la conexión WebSocket en el mismo puerto en el que se ejecuta un servidor web (para que el servidor web pueda reenviarlos), pero una vez que se establece la conexión, el servidor web no está en el bucle. WebSockets no se limita a los clientes del navegador. Vea libwebsocket que tiene un cliente que no es navegador y un servidor.
kanaka
14
OKAY. Ya veo ... Como no puedo eliminar esta respuesta aceptada, le pediría que la edite con la información correcta. ¡Gracias!
Pablo Santa Cruz
2
Puede crear clientes websocket y usarlos fuera de los navegadores. El protocolo websocket es HTTP 1.1 con una conexión actualizada a "websocket".
Roger F. Gay
2
@huggie nope. Hay un pequeño encuadre: tools.ietf.org/html/rfc6455#section-5 (2 bytes para mensajes pequeños).
kanaka
2
@NiCkNewman esa es probablemente una buena pregunta separada en realidad. La sobrecarga del encuadre es mínima y no es el problema. El problema con WebSockets para redes MMO es doble: es solo un servidor cliente y es TCP (basado en transmisión). Para un buen rendimiento de red MMO, también necesita una red directa de igual a igual y necesita un datagrama (una baja latencia constante es más importante que recibir cada paquete). La buena noticia es que WebRTC DataChannel tiene ambas propiedades, por lo que comenzará a llenar el vacío y permitirá juegos AAA MMO completos en el navegador.
kanaka
21

Websockets usan sockets en su implementación. Websockets se basan en un protocolo estándar (ahora en la llamada final, pero aún no final) que define una conexión "apretón de manos" y un mensaje "marco". Las dos partes pasan por el procedimiento de protocolo de enlace para aceptar mutuamente una conexión y luego usan el formato de mensaje estándar ("marco") para pasar los mensajes de un lado a otro.

Estoy desarrollando un marco que le permitirá comunicarse directamente de máquina a máquina con el software instalado. Puede adaptarse a su propósito. Puede seguir mi blog si lo desea: http://highlevellogic.blogspot.com/2011/09/websocket-server-demonstration_26.html

Roger F. Gay
fuente
11

Tendría que usar WebSockets (o algún módulo de protocolo similar, por ejemplo, como lo admite el complemento Flash) porque una aplicación de navegador normal simplemente no puede abrir un socket TCP puro.

El Socket.IOmódulo disponible para node.jspuede ayudar mucho, pero tenga en cuenta que se trata no de un módulo de WebSocket puro en su propio derecho.

En realidad, es un módulo de comunicaciones más genérico que puede ejecutarse sobre otros protocolos de red, incluidos WebSockets y Flash Sockets.

Por lo tanto, si desea usar Socket.IOen el servidor, también debe usar su código de cliente y sus objetos. No puede realizar fácilmente WebSocketconexiones sin formato a un socket.ioservidor, ya que tendría que emular su protocolo de mensaje.

Alnitak
fuente
11

WebSocket es solo otro protocolo de nivel de aplicación sobre protocolo TCP, al igual que HTTP.

Algunos fragmentos <Spring in Action 4> citados a continuación, espero que puedan ayudarlo a comprender mejor WebSocket.

En su forma más simple, un WebSocket es solo un canal de comunicación entre dos aplicaciones (no necesariamente un navegador está involucrado) ... La comunicación WebSocket se puede usar entre cualquier tipo de aplicaciones , pero el uso más común de WebSocket es facilitar la comunicación entre un aplicación de servidor y una aplicación basada en navegador.

smwikipedia
fuente
2

Con respecto a su pregunta (b), tenga en cuenta que la especificación Websocket no se ha finalizado. De acuerdo con el W3C :

Los implementadores deben tener en cuenta que esta especificación no es estable.

Personalmente, considero que Websockets es demasiado sangriento como para usarlo en la actualidad. Aunque probablemente los encuentre útiles en un año más o menos.

Phil Hunt
fuente
¿Qué pasa ahora, 9 años después?
Venryx