Как резервный вариант работает с socket.io?

Я хотел бы использовать WebSocket с Java. Проблема в том, что мой сервер отделен от клиента прокси-сервером, который невозможно настроить. Я искал реализации WebSocket с запасными вариантами, такими как long-polling. Я нашел socket.io, но не знаю, как работает запасной вариант.

В каком случае он заменяет WebSocket и как?

Существуют ли другие библиотеки, такие как socket.io, с резервными реализациями? Я хотел бы найти его в Java, но нашел только Jetty.

EDIT: резервный вариант зависит только от совместимости браузера с WebSocket? Что, если причиной сбоя является плохо настроенный прокси-сервер, будет ли socket.io обнаруживать это как сбой совместимости и, таким образом, переключаться на длительный опрос (или другой метод)?

Ответ: начиная с версии 1, socket.io включает engine.io, который приносит следующие черты:

введите описание изображения здесь


person Grégoire Borel    schedule 01.10.2015    source источник


Ответы (1)


Socket.io является одной из нескольких реализаций протокола веб-сокетов, и его основным преимуществом (IMO) является простота использования: вам не нужно кодировать механизмы поддержания активности или решать, какой транспорт лучше, он делает это за вас.

Итак, чтобы было понятно, socket.io не заменяет протокол websocket, это пакет, который реализует его за вас.

Вы упомянули о длительном опросе. Это один из транспортов, используемых socket.io. Долгий опрос основан на HTTP, и в основном это запрос --> ожидание --> ответ, и ожидание не очень долгое, так как балансировщики нагрузки могут отбросить его при EOF или устаревших соединениях. Тем не менее, это все еще полезно, когда протокол веб-сокетов (на основе TCP) недоступен, и socket.io автоматически восстанавливает соединение для вас. Обратите внимание, что веб-сокеты — это относительно новый протокол, ратифицированный в 2011 году, поэтому старые браузеры его не поддерживают. Что ж, socket.io обнаруживает это, а затем прибегает к длительному опросу, так что вам не нужно об этом «беспокоиться».

Соединение через веб-сокет начинается с HTTP, прослушивая тот же порт. Например, http://localhost:8080 (просто глупый пример). Затем, когда это возможно, socket.io переключается на ws://localhost:8080.

У меня никогда не было проблем с проблемами топологии сети при использовании socket.io, так как, когда HTTP-порт доступен и возможно использование длинных опросов / веб-сокетов, это просто сработало для меня.

Одна из библиотек с резервной реализацией, как вы упомянули, — это netty-socket.io. Обратите внимание, как он настраивает два транспорта:

public class Configuration {

    private ExceptionListener exceptionListener = new DefaultExceptionListener();

    private String context = "/socket.io";

    private List<Transport> transports = Arrays.asList(Transport.WEBSOCKET, Transport.POLLING);

    private int bossThreads = 0; // 0 = current_processors_amount * 2
    private int workerThreads = 0; // 0 = current_processors_amount * 2

Полный код можно найти здесь.

В Node JS также есть библиотеки для веб-сокетов, и я упомянул их здесь только для того, чтобы пояснить, что длинные опросы и веб-сокеты — не единственные два доступных транспорта (возможно, единственные в Java):

io.set('transports', [                     // enable all transports (optional if you want flashsocket)
            'websocket'
          , 'flashsocket'
          , 'htmlfile'
          , 'xhr-polling'
          , 'jsonp-polling'
        ]);

В двух словах, socket.io пытается сделать все как можно проще для вас, в том числе не нужно беспокоиться о том, какие транспорты использовать, поскольку это делается для вас скрыто, но при этом все еще настраивается, если вы хотите.

Я надеюсь, что это краткое объяснение поможет вам!

person arnold    schedule 01.10.2015
comment
Так и есть, большое спасибо! Вы бы порекомендовали netty-socket.io в бизнес-среде? Это кажется последовательным. Преимуществом будет язык Java, который легче предложить клиенту и разработчикам. Другой вопрос (добавлен в ОП): зависит ли откат только от совместимости браузера с WebSocket? Что, если причиной сбоя является плохо настроенный прокси-сервер, будет ли socket.io обнаруживать это как сбой совместимости и, таким образом, переключаться на длительный опрос (или другой метод)? - person Grégoire Borel; 02.10.2015
comment
Да, это был бы мой ответ на все ваши вопросы. Откат на socket.io работает как черная магия: он начинается с наилучшего возможного соединения, а затем продолжает снижаться до тех пор, пока не произойдет сбой. Однако вы либо любите это, либо ненавидите. У меня есть коллеги, которым не нравится эта функциональность: они хотят кодировать запасной вариант, поддерживать жизнь (сердцебиение) самостоятельно. Если это так, то, во что бы то ни стало, используйте engine.io, на котором построен socket.io. Все зависит от того, насколько вы хотите кодировать самостоятельно или полагаться на инструмент. Лично я люблю socket.io, но это только мое мнение. - person arnold; 02.10.2015
comment
О Java: он использует пулы потоков для соединений, которые могут быть дорогостоящими в массовом масштабе. Обратите внимание, что пулы потоков в основном представляют собой функции разделения времени, а не настоящие потоки (вплоть до кода ЦП). Если у вас большое количество клиентов И вы открыты для других инструментов, Node JS может лучше подойти для вашего случая. Его архитектура является асинхронной, неблокирующей, однопоточной. Но это не по теме, так как ваш вопрос был о socket.io. Я добавил этот комментарий, потому что вы спросили о Java. В двух словах: на Java можно делать практически все, но есть и другие инструменты. Удачи! - person arnold; 02.10.2015
comment
Это хороший ответ, но вы могли бы ответить на вопрос? Заголовок в настоящее время искажает поиск потока стека. Вопросы в том, как? Есть ли конфигурации, которые вам нужно сделать? Можем ли мы хотя бы дать ссылку на документы, где есть пример? - person Urasquirrel; 18.04.2019
comment
@urasquirrel Вы можете проверить документы socket.io для параметров конфигурации и посмотреть, как это работает. Я не мог включить все в свой ответ. Извините за результаты поиска, я ничего не могу с этим поделать. - person arnold; 19.04.2019
comment
@arnold Я думаю, что ответ, который я искал, это ... это происходит автоматически под капотом, вам не нужно ничего делать. Это правильно? Если это так, я полагаю, вы ответили на вопрос любезно, но я чувствую, что заголовок вопроса лучше подходит для того, чтобы сказать: как socket.io обрабатывает автоматический откат? . Можно предположить, что текущий заголовок означает «Что я должен сделать, чтобы заставить работать автоматический резервный вариант», но если socketio справляется с этим самостоятельно без какой-либо дополнительной работы, тогда… Не путайте в будущем. - person Urasquirrel; 19.04.2019
comment
По состоянию на 2020 год все еще имеет смысл реализовывать веб-приложения с механизмом отката при длительном опросе или мы можем просто придерживаться только протокола WebSocket и все готово? - person tonix; 11.10.2020