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