Как открыть несколько веб-сокетов с помощью Jetty Java

Я использую org.eclipse.jetty.websocketclient и хочу открыть несколько веб-сокетов для разных URL-адресов. Я работаю с Явой.

Как мне это сделать? Я хочу открыть веб-сокеты в нескольких потоках. 1. Нужно ли создавать websocketclient для каждого подключения? 2. Могу ли я использовать любую фабрику websocketclient? Есть ли? 3. Нужно ли открывать только один websocketclient, держать его открытым и как-то открывать с его помощью веб-сокеты? 4. Что не так с созданием нескольких клиентов веб-сокетов?


person bilgo    schedule 02.03.2015    source источник


Ответы (1)


Этот ответ говорит о Jetty 9 WebSockets.

у вас есть 1 WebSocketClient, думайте об этом как о браузере, при каждом вызове которого connect() устанавливается новое соединение.

Каждый вызов connect() должен иметь новый экземпляр WebSocket, каждый экземпляр будет управляться Executor WebSocketClient, в результате чего каждый экземпляр веб-сокета будет находиться в своем собственном потоке.

Последующие ответы

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

Вообще говоря, избегайте повторного использования объектов для нескольких запросов, если только вы не знаете, что делаете. Пример: ClientUpgradeRequest и URI связаны с сеансом WebSocket, который при повторном использовании в нескольких соединениях будет иметь изменение состояния при закрытии первого соединения, что сделает данные недействительными для других соединений, а также ссылки на сборку мусора. которые затрудняют очистку старых соединений, пока все соединения не будут закрыты.

Вы можете вызвать connect() одновременно, сделайте это. Каждая попытка подключения обрабатывается на основе поведения Executor (например: если у вас есть однопоточный Executor, то за раз происходит только 1 подключение)

Создание нового WebSocketClient для каждого подключения является чрезмерно расточительством ресурсов. Это было бы похоже на запуск всего веб-сервера для каждого входящего запроса. WebSocketClient управляет селекторами, потоками, отслеживанием сеансов и т. д. Я понимаю, откуда вы пришли, со старыми клиентскими библиотеками http, имеющими такое поведение, но даже эти http-клиенты обновляются до этой новой модели браузера благодаря spdy и http /2.

person Joakim Erdfelt    schedule 02.03.2015
comment
Хорошо, спасибо. Итак, мне нужно запускать и останавливать WebSocketClient только один раз и вызывать соединение каждый раз, когда я хочу поговорить с другим веб-сокетом? Нужно ли мне создавать новый ClientUpgradeRequest, URI и WebSocketListener для каждого подключения? Могу ли я одновременно подключиться к URI с двумя веб-сокетами? Что произойдет, если я создам WebSocketClient для каждого веб-сокета? - person bilgo; 03.03.2015
comment
Спасибо, Йоаким. Это то, что я искал. Я собираюсь оставить WebSocketClient запущенным и создать ClientUpgradeRequest, URI и WebSocketListener для каждого соединения. - person bilgo; 03.03.2015