Клиентский сокет .io без сервера node.js - программирование
Подтвердить что ты не робот

Клиентский сокет .io без сервера node.js

Чтобы использовать socket.io на стороне клиента, обычно мы запускаем сервер node.js и делаем следующее:

<script src="/socket.io/socket.io.js"></script>

или со специальным портом:

<script src="http://localhost:3700/socket.io/socket.io.js"></script>

Вопрос:

нужно ли использовать сервер node.js для вызова socket.io.js?

... или возможно

сделать локальную копию socket.io.js вместо перехода на сервер каждый раз, когда нам нужен socket.io?


как, мы идем посмотреть источник и скопировать все, что мы получили из источника тега script,

вставьте и сохраните его как socket.io-local.js, чтобы в следующий раз мы использовали:

<script src="socket.io-local.js"></script>

будут работать?


Обновление

Спасибо за отличный ответ,

Я спрашиваю об этом, потому что в том случае, когда я участвую, у меня фактически нет доступа к серверу:

Я пишу клиентскую сторону для подключения к другому разработчику Socket Sever, который написан на Java.

Поэтому мне нужно подумать о том, как обойти тот факт, что у меня нет сервера для меня.

от того, что я тестировал, этот способ, похоже, работает, но я действительно не знаю, что происходит за сценой.

4b9b3361

Ответ 1

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

Чтобы понять, почему, вам нужно понять, что socket.io действительно делает за кулисами; клиентская библиотека является лишь малой ее частью.

Socket.io фактически определяет и реализует собственный протокол для обмена в реальном времени между браузером и сервером. Он делает это таким образом, что поддерживает несколько транспортов: if — например, пользовательский браузер или прокси не поддерживает WebSockets, он может вернуться к длительный опрос.

На самом деле клиент socket.io:

  • Делает запрос XHR GET для /socket.io/1. Сервер отвечает идентификатором сеанса, настроенными тайм-аутами и поддерживаемыми транспортными средствами.
  • Клиент выбирает лучший транспорт, который поддерживает браузер пользователя. В современных браузерах он будет использовать WebSockets.
  • Если WebSockets поддерживаются, он создает новый WebSocket, чтобы инициировать соединение WebSocket (HTTP GET с заголовком Upgrade: websocket) на специальный URL – /socket.io/1/websocket/<session id>.
  • Если WebSockets не поддерживается браузером или не подключается (существует множество посредников в дикой природе, таких как прокси, фильтры, сетевые устройства безопасности и т.д., которые не поддерживают запросы WebSocket), библиотека возвращается на длительный опрос XHR и делает запрос XHR /socket.io/1/xhr-polling/<sesion id>. Сервер не отвечает на запрос до тех пор, пока не будет доступно новое сообщение или не будет достигнут тайм-аут, после чего клиент повторит запрос XHR.

Компонент сервера Socket.io обрабатывает другой конец этого беспорядка. Он обрабатывает все URL-адреса под /socket.io/, настраивает сеансы, анализирует обновления WebSocket, фактически отправляет сообщения и кучу других учетных записей.

Без всех услуг, предоставляемых сервером socket.io, клиентская библиотека довольно бесполезна. Он просто сделает запрос XHR на URL-адрес, который не существует на вашем сервере.

Я предполагаю, что ваш Java-сервер просто реализует протокол WebSockets. Вы можете напрямую подключиться к нему с помощью предоставленных браузером API WebSocket.

Возможно, ваш сервер реализует протокол socket.io – есть несколько заброшенных Java-проектов, чтобы сделать это & ​​ndash; но это маловероятно. Поговорите с разработчиком вашего сервера, чтобы узнать, как он реализовал "сервер сокетов".

Ответ 2

Отдельная сборка socket.io-client автоматически открывается сервером socket.io как /socket.io/socket.io.js. В качестве альтернативы вы можете обслуживать файл socket.io-client.js, расположенный в корне этот репозиторий.

https://github.com/LearnBoost/socket.io-client

У меня есть модуль под названием shotgun-client, который фактически обертывает socket.io. Мне нужно было обслуживать пользовательский клиент script, а также клиент socket.io script, но я не хотел, чтобы каждый пользователь моего модуля включал в себя несколько ссылок script на своих страницах.

Я обнаружил, что при установке вы можете обслуживать сгенерированный клиент script из socket.io чтение файла /node_modules/socket.io/node_modules/socket.io-client/dist/socket.io.js. Поэтому мой модуль добавляет слушателя к собственному URL-адресу, и когда он обслуживает мой пользовательский клиент script, он также обслуживает клиент socket.io script. Виола! Только одна ссылка script для пользователей моего модуля:)

Ответ 3

Хотя это технически возможно, я не понимаю, зачем вам это нужно. Если вы беспокоитесь о сокращении данных, которые проходят по проводу, это изменение на самом деле не намного превысит несколько символов, сохраненных в более коротком теге src. Простое изменение местоположения JS файла на сервере фактически не улучшит производительность - JS должен быть отправлен.

Правильное кэширование (которое имеет Socket.IO) вернет 304 Not Modified (и не пересылает JS файл каждый раз при загрузке страницы).