Ответы пользователя по тегу WebSocket
  • Как лучше организовать API для работы с websockets?

    bingo347
    @bingo347
    Crazy on performance...
    WebSocket подразумевает постоянное соединение с сервером, разные эндпоинты подразумевают разные соединения, что само по себе дорого и не дает ни каких преимуществ.
    Притом WebSocket - это двусторонняя связь, любая сторона (и клиент и сервер) может отправить свое сообщение в любой момент времени. Как правило поверх WebSocket используют какой-либо RPC протокол чтобы реализовать механизм запрос-ответ и маршрутизировать различные запросы.
    Ответ написан
    Комментировать
  • Как решить проблему с WebSockets?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    Вы на каждый запрос по http, который обрабатывается Вашим middleware делаете подписку на websocket connection, тем самым плодите обработчики.
    У Вас вебсокет вообще никак не связан с http и сидит на отдельном порту.

    При желании, кстати можно переиспользовать инстанс http сервера и для express и для websocket, тогда они на одном порту будут.
    Ответ написан
    3 комментария
  • Как в JavaScript можно конвертировать картинку в массив байтов, для последующей передачи картинки через веб-сокет?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    https://developer.mozilla.org/ru/docs/Web/API/File...
    https://developer.mozilla.org/en-US/docs/Web/API/R...
    А то, как получить из картинки Blob - зависит от того, в каком виде у Вас сейчас картинка
    Ответ написан
    Комментировать
  • 300 веб сокетов?

    bingo347
    @bingo347 Куратор тега Node.js
    Crazy on performance...
    Если операции вычисления блокирующие и блокирует они поток надолго, то стоит вынести их в воркеры, само количество воркеров лучше выбрать по количеству логических ядер (хардварных потоков), а распределять задачи можно простым round robin алгоритмом, если сами задачи примерно одинаковые.
    А насчет сокетов, 300 постоянных коннектов на 1 процесс/поток для ноды сущий пустяк, она спокойно переварит несколько десятков тысяч, если поток не блокировать дольше нескольких десятков операций
    Ответ написан
    2 комментария
  • Как использовать WSS вместо WS в Node.js?

    bingo347
    @bingo347 Куратор тега Node.js
    Crazy on performance...
    Вариант 1 (правильный):
    1. поставить nginx или haproxy и настроить tls там
    2. настроить в nginx/haproxy реверс прокси на ноду
    3. порты ноды закрыть от внешнего мира, слушать только localhost или vlan

    Вариант 2:
    В настройках WebSocket передавать не порт, а инстанс https сервера
    https://www.npmjs.com/package/ws#external-https-server

    Ну и наконец, зачем самоподписанный сертификат, когда есть Let's Encrypt?
    Ну и записать в сертификат IP адрес не получится, нужен домен
    Ответ написан
  • Как работает websocket на низком уровне?

    bingo347
    @bingo347
    Crazy on performance...
    Вопрос 1
    Браузер инициирует новое tcp соединение на тот же 80 порт сервера или бывают случаи что на другой ?
    WebSocket работает не поверх голого tcp, а поверх http (а тот уже поверх tcp или tls -> tcp). 80 порт стандартный для http, а 443 - для https (http поверх tls). WebSocket по умолчанию использует те же 80 и 443 порты для ws и wss протоколов соответственно. Но никто не мешает использовать кастомный порт. Конкретные порты для конкретных протоколов - это не более соглашения. Порты работают на IP уровне, который ничего не знает о прикладном уровне.

    Вопрос 2
    Что сервер делает с ws пакетами - проксирует их к СП как есть в обертке, или же обертку раскрывает и передает "чистые/сырые" данные далее ?
    Если речь идет о nginx как о реверси прокси, то для него это обычный http запрос, просто клиент очень долго шлет тело запроса, а сервер тело ответа (главное таймауты тут выключить). Так как http в принципе не запрещает серверу начать слать ответ не закончив чтение запроса, все вполне прекрасно работает.

    Вопрос 3
    Как сервер отличает ws от http - по некой сигнатуре - типа по последовательности первых пришедших байт, по которым можно распознать что это именно ws а не http ?
    По http заголовкам. В частности клиент шлет заголовок upgrade в котором говорит, что хочет WebSocket и еще несколько специфичных для WebSocket заголовков, а сервер отвечает статусом 101 и своим набором заголовков. Это и есть WebSocket рукопожатие. Само общение происходит уже в теле запроса и теле ответа.

    Вопрос 4
    Как эти данные передаются в сторону СП - через переменные окружения, или через unix-socket или через tcp стек?
    Если используя последние два варианта, то получается что сервер держит внутри системы соединения с СП до тех пор пока "наружное" tcp соединение между клиентом и сервером не буде закрыто?
    На уровне tcp вообще пофиг сколько времени открыто соединение, какая из сторон в какой последовательности и сколько данных отправляет. Тут лишь то, что клиент может попробовать открыть соединение, сервер его может принять (или отклонить), а после любая из сторон может слать данные другой или закрыть соединение. Ну и плюс есть гарантии, что потерянные данные будут отправлены повторно и порядок получения совпадет с порядком отправки. На уровне http у нас обычный запрос-ответ, просто клиент слишком долго шлет тело запроса, а сервер - тело ответа. На уровне WebSocket у нас в обе стороны ходят MessageFrame'ы, содержащие данные + метаданные и имеющие четкие границы.

    Вопрос 5
    В свою очередь СП это отдельный unix процесс отличный от основного бекенд приложения, которое работает по принципу "спросили - запустился - обработал - сформировал ответ - отправил - завершился" Или же это все то же бекенд приложение только в том случае если с ним установлено ws-соединение, оно не прекращает свою работу?
    Как реализуете, так и будет. Но одно можно сказать точно, соединение должно быть открытым на протяжении всего сеанса обмена сообщениями.
    Важно еще понимать, что в контексте WebSocket нет понятий запрос и ответ (хотя их могут реализовывать нижележащие протоколы), есть лишь понятие сообщение. Каждая из сторон, пока открыто соединение, может в любой момент времени отправлять любое количество сообщений.

    P.S. если обе стороны (и клиент и сервер) не ограничены только http протоколом для общения через tcp (как например это происходит у браузерных приложений), то WebSocket будет лишней нагрузкой как на сеть, так и на вычисления. Лучше взять какой-нибудь бинарный сериализатор, с четкими границами (msgpack, flatbuffer) и гонять данные по raw tcp или tls.
    Ответ написан
    2 комментария
  • Как получить статус отправки сообщения через WebSocket?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    вообще websocket в конечном итоге работает поверх tcp, который сам уведомляет другую сторону о доставке пакета, а если уведомление не получено - через время шлет пакет повторно
    у самого websocket нет такого встроенного механизма, но никто не мешает реализовать такое самостоятельно
    Ответ написан
  • Подойдет ли SSE или оставить WebSocket?

    bingo347
    @bingo347 Куратор тега Node.js
    Crazy on performance...
    И SSE и WS - протоколы поверх http, оба могут работать поверх http/2 и иметь мультиплексирование
    Но есть между ними и различия:
    WS обеспечивает двухстороннюю связь, после установления рукопожатия любая сторона может слать сообщения, протокол бинарный, все сообщения кодируются в бинарные message-frame, что требует доп библиотек на стороне сервера (на браузере такая идет в стандартном апи), зато позволяет передавать как бинарные так и текстовые данные
    SSE - односторонняя связь, только от сервера к клиенту, клиент может передать данные только в url при открытии соеденения, дальше вещает только сервер, протокол текстовый, если есть бинарные данные их придется обернуть в base64 (например), с точки зрения сервера - это обычный GET запрос, который сервер не закрывает, а просто шлет данные в http body в особом формате, делая периодически flush соединения (в идеале после каждого сообщения)

    Все остальное, вроде комнат и т.д. - надстройки библиотек и не более
    В случае koa - по дефолту он завершает запрос когда зарезолвится промис из последнего middleware, для SSE придется это обходить
    Ответ написан
    Комментировать
  • Как на клиенте (html-страница) получать сообщения от сервера на вебсокетах?

    bingo347
    @bingo347
    Crazy on performance...
    В Python Вы запустили tcp-raw сокет, а браузер от Вас ожидает протокол WebSocket
    Ответ написан
    1 комментарий
  • Как подключиться к WebSocket'y?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    если опция verifyClient установлена, то она должна быть функцией, которая либо возвращает true/false (принимать рукопожатие или нет) либо вызывать колбэк из 2 аргумента
    https://github.com/websockets/ws/blob/master/doc/ws.md
    Ответ написан
    Комментировать
  • Как заставить работать WebSockets на HTTPS?

    bingo347
    @bingo347 Куратор тега Node.js
    Crazy on performance...
    Очевидно браузер посылает куда подальше Ваш сертификат
    Сертификат выдается на домен а не ip адрес, обращайтесь к вебсокету через домен прописанный в сертификате, в dns должна быть А запись связывающая домен и ip адрес
    Ответ написан
    4 комментария
  • Какой WebSocket сервер посоветуете?

    bingo347
    @bingo347
    Crazy on performance...
    Единственный плюс socket.io - это его удобство
    Внутри у него отвратительный код с кучей деоптимизирующих конструкций, поверьте я его перелопатил весь, реализуя различные костыли к этой библиотеке, чтобы оно просто работало нормально
    Не говоря уже о том, что Вы создадите утечку памяти просто отправив запрос с коллбэком (ожидающий ответа), а другая сторона по какой-то причине не ответит.

    Если нужно реализовать сокеты быстро, socket.io вполне себе хорошее решение
    Если есть время на реализацию чего-то более качественного - библиотека ws, socket.io кстати использует именно ее
    Если нужна эмуляция сокетов в старых браузерах - sockjs, хотя лично мне использовать ее не доводилось, но в зависимостях у нее websocket, которая на момент ее использования (весна 2015) имела неприятные баги, возможно сейчас что-то изменилось
    Ответ написан