Diferença entre socket e websocket?

178

Estou criando um aplicativo da web que precisa se comunicar com outro aplicativo usando conexões de soquete. Este é um novo território para mim, então, tenha certeza de que os soquetes são diferentes dos websockets . Parece que eles são apenas conceitualmente semelhantes.

Perguntando, porque inicialmente eu planejava usar o Django como base para o meu projeto, mas no post do SO a que vinculei acima, ficou muito claro que os websockets não são possíveis (ou pelo menos não são confiáveis, mesmo com algo como django-websockets ) usando a configuração preferida do Django (Apache com mod_wsgi). No entanto, encontrei outras postagens que importam casualmente o módulo de soquete do Python para algo tão simples quanto pegar o nome do host do servidor .

Assim:

  • Eles são realmente diferentes?
  • Existe alguma razão para não usar o Django para um projeto que depende do estabelecimento de conexões de soquete com um servidor externo?
Jonathon
fonte

Respostas:

141

Para responder suas perguntas.

  1. Mesmo que eles consigam (em geral) coisas semelhantes, sim , eles são realmente diferentes. Os WebSockets geralmente são executados a partir de navegadores que se conectam ao Application Server através de um protocolo semelhante ao HTTP executado no TCP / IP . Portanto, eles são principalmente para aplicativos da Web que requerem uma conexão permanente com seu servidor. Por outro lado, soquetes simples são mais poderosos e genéricos. Eles são executados sobre TCP / IP, mas não estão restritos a navegadores ou protocolo HTTP . Eles podem ser usados ​​para implementar qualquer tipo de comunicação.
  2. Não. Não há razão.
Pablo Santa Cruz
fonte
128
WebSockets não são semelhantes ao HTTP. São soquetes normais com algum enquadramento e um handshake compatível com HTTP. O handshake compatível com HTTP é apenas para permitir a conexão do WebSocket na mesma porta em que um servidor da web está sendo executado (para que o servidor da web possa encaminhá-lo), mas, uma vez estabelecida a conexão, o servidor da web não está no loop. O WebSockets não se limita aos clientes do navegador. Veja libwebsocket que possui um cliente que não é um navegador e um servidor.
kanaka
14
ESTÁ BEM. Entendo ... Como não consigo excluir esta resposta aceita, solicito que você a edite com as informações corretas. Obrigado!
Pablo Santa Cruz
2
Você pode criar clientes Websocket e usá-los fora dos navegadores. O protocolo websocket é HTTP 1.1 com uma conexão atualizada para "websocket".
Roger F. Gay
2
@huggie nope. Há um pouco de enquadramento: tools.ietf.org/html/rfc6455#section-5 (2 bytes para mensagens pequenas).
Kanaka
2
@NiCkNewman essa provavelmente é uma boa pergunta separada, na verdade. A sobrecarga do enquadramento é mínima e não é o problema. O problema com o WebSockets para redes MMO é duplo: é apenas servidor cliente e é TCP (baseado em fluxo). Para um bom desempenho da rede MMO, você também precisa de uma rede direta ponto a ponto e precisa de datagramas (a baixa latência consistente é mais importante do que receber todos os pacotes). A boa notícia é que o WebRTC DataChannel possui essas duas propriedades, por isso começará a preencher a lacuna e permitirá jogos MMO AAA completos no navegador.
kanaka
21

Websockets usam soquetes em sua implementação. Os Websockets são baseados em um protocolo padrão (agora em chamada final, mas ainda não final) que define um "handshake" de conexão e um "frame" de mensagem. Os dois lados passam pelo procedimento de handshake para aceitar uma conexão mutuamente e, em seguida, usam o formato de mensagem padrão ("quadro") para passar mensagens para frente e para trás.

Estou desenvolvendo uma estrutura que permitirá que você se comunique diretamente de máquina para máquina com o software instalado. Pode servir ao seu propósito. Você pode seguir o meu blog, se desejar: http://highlevellogic.blogspot.com/2011/09/websocket-server-demonstration_26.html

Roger F. Gay
fonte
11

Você precisaria usar WebSockets (ou alguns módulo de protocolo semelhante, por exemplo, como suportado pelo plug-in Flash) porque um aplicativo normal de navegador simplesmente não pode abrir um soquete TCP puro.

O Socket.IOmódulo disponível para node.jspode ajudar muito, mas nota que é não um módulo WebSocket puro em seu próprio direito.

Na verdade, é um módulo de comunicação mais genérico que pode ser executado em cima de vários outros protocolos de rede, incluindo WebSockets e soquetes Flash.

Portanto, se você deseja usar Socket.IOno servidor, também deve usar o código e os objetos do cliente. Você não pode facilmente fazer WebSocketconexões brutas com um socket.ioservidor, pois teria que emular o protocolo de mensagens deles.

Alnitak
fonte
11

O WebSocket é apenas outro protocolo no nível do aplicativo sobre o protocolo TCP, assim como o HTTP.

Alguns trechos <Spring in Action 4> citados abaixo, espero que possam ajudá-lo a entender melhor o WebSocket.

Na sua forma mais simples, um WebSocket é apenas um canal de comunicação entre dois aplicativos (não necessariamente um navegador está envolvido) ... A comunicação WebSocket pode ser usada entre qualquer tipo de aplicativo , mas o uso mais comum do WebSocket é facilitar a comunicação entre um aplicativo de servidor e um aplicativo baseado em navegador.

smwikipedia
fonte
2

Em relação à sua pergunta (b), lembre-se de que a especificação Websocket não foi finalizada. De acordo com o W3C :

Os implementadores devem estar cientes de que esta especificação não é estável.

Pessoalmente, considero que os Websockets são muito avançados para serem usados ​​no momento. Embora eu provavelmente os ache úteis em um ano ou mais.

Phil Hunt
fonte
E agora, 9 anos depois?
Venryx 30/06