Разница между сокетом и веб-сокетом?

178

Я создаю веб-приложение, которое должно взаимодействовать с другим приложением, используя сокетные соединения. Для меня это новая территория, поэтому хочу быть уверен, что сокеты отличаются от веб-розеток . Кажется, что они только концептуально похожи.

На вопрос, потому что изначально я планировал использовать Django в качестве основы для моего проекта, но в посте SO, на который я ссылался выше, стало ясно, что веб-сокеты невозможны (или, по крайней мере, не надежны, даже с чем-то вроде django-websockets ) с использованием предпочтительной настройки Django (Apache с mod_wsgi). Тем не менее, я нашел другие посты, которые случайно импортируют модуль сокета Python для чего-то такого же простого, как получение имени хоста сервера .

Так:

  • Они действительно разные?
  • Есть ли какая-либо причина не использовать Django для проекта, который основывается на установлении сокетных соединений с внешним сервером?
Джонатон
источник

Ответы:

141

Чтобы ответить на ваши вопросы.

  1. Даже если они достигают (в целом) подобные вещи, да , они есть на самом деле разные. WebSockets обычно запускаются из браузеров, подключающихся к Серверу приложений по протоколу, аналогичному HTTP, который работает по TCP / IP . Таким образом, они в первую очередь для веб-приложений, которые требуют постоянного подключения к своему серверу. С другой стороны, простые розетки являются более мощными и общими. Они работают по протоколу TCP / IP, но не ограничиваются браузерами или протоколом HTTP . Они могут быть использованы для реализации любого вида связи.
  2. Нет причин.
Пабло Санта Круз
источник
128
WebSockets не похожи на HTTP. Это обычные сокеты с некоторым кадрированием и HTTP-совместимым рукопожатием. HTTP-совместимое рукопожатие просто разрешает соединение WebSocket с тем же портом, на котором работает веб-сервер (чтобы веб-сервер мог их переадресовать), но как только соединение установлено, веб-сервер не зацикливается. WebSockets не ограничивается браузерными клиентами. Смотрите libwebsocket, в котором есть и клиент без браузера, и сервер.
канака
14
ХОРОШО. Я вижу ... Так как я не могу удалить этот принятый ответ, я прошу вас отредактировать его с правильной информацией. Спасибо!
Пабло Санта Круз
2
Вы можете создавать клиенты websocket и использовать их вне браузеров. Протокол веб-сокета - HTTP 1.1 с обновленным подключением к «веб-сокету».
Роджер Ф. Гей
2
@ Huggie Нету. Небольшое количество кадров: tools.ietf.org/html/rfc6455#section-5 (2 байта для небольших сообщений).
Канака
2
@NiCkNewman это, наверное, хороший отдельный вопрос. Накладные расходы минимальны и не являются проблемой. Проблема с WebSockets для MMO-сетей является двоякой: это только клиентский сервер и TCP (на основе потоков). Для хорошей производительности сети MMO вам также необходимы прямые одноранговые сети и дейтаграммы (постоянная низкая задержка важнее, чем получение каждого пакета). Хорошая новость заключается в том, что WebRTC DataChannel обладает обоими этими свойствами, поэтому он начнет заполнять пробел и позволять полноценные игры AAA MMO в браузере.
Канака
21

Веб-сокеты используют сокеты в своей реализации. Веб-сокеты основаны на стандартном протоколе (теперь в окончательном вызове, но еще не окончательном), который определяет «рукопожатие» соединения и «кадр» сообщения. Обе стороны проходят процедуру рукопожатия, чтобы взаимно принять соединение, а затем используют стандартный формат сообщения («кадр») для передачи сообщений туда и обратно.

Я разрабатываю фреймворк, который позволит вам напрямую связывать машину с машиной с установленным программным обеспечением. Это может удовлетворить вашу цель. Вы можете следить за моим блогом, если хотите: http://highlevellogic.blogspot.com/2011/09/websocket-server-demonstration_26.html

Роджер Ф. Гей
источник
11

Вам придется использовать WebSockets (или какой-либо аналогичный модуль протокола, например, поддерживаемый плагином Flash), потому что обычное приложение браузера просто не может открыть чистый сокет TCP.

Доступный Socket.IOмодуль node.jsможет сильно помочь, но учтите, что он не является чистым модулем WebSocket сам по себе.

На самом деле это более общий коммуникационный модуль, который может работать поверх других сетевых протоколов, включая WebSockets и Flash-сокеты.

Следовательно, если вы хотите использовать Socket.IOна стороне сервера, вы также должны использовать их клиентский код и объекты. Вы не можете легко устанавливать необработанные WebSocketсоединения с socket.ioсервером, поскольку вам придется эмулировать их протокол сообщений.

Альнитак
источник
11

WebSocket - это просто еще один протокол прикладного уровня по протоколу TCP, такой же, как HTTP.

Некоторые фрагменты <Spring in Action 4>, цитируемые ниже, надеются, что они помогут вам лучше понять WebSocket.

В своей простейшей форме WebSocket - это просто канал связи между двумя приложениями (не обязательно задействован браузер) ... Связь WebSocket может использоваться между любыми видами приложений , но наиболее распространенное использование WebSocket - это упрощение связи между серверное приложение и приложение на основе браузера.

smwikipedia
источник
2

Что касается вашего вопроса (б), имейте в виду, что спецификация Websocket не была завершена. Согласно W3C :

Разработчики должны знать, что эта спецификация не является стабильной.

Лично я считаю, что веб-сокеты в настоящее время слишком далеки от использования. Хотя я, вероятно, найду их полезными через год или около того.

Фил Хант
источник
А сейчас, 9 лет спустя?
Venryx