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?

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.

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


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.


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.


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.


E agora, 9 anos depois?
— Venryx 30/06
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.