Клиентский сокет .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.
Поэтому мне нужно подумать о том, как обойти тот факт, что у меня нет сервера для меня.
от того, что я тестировал,
этот способ, похоже, работает, но я действительно не знаю, что происходит за сценой.
Ответы
Ответ 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 файл каждый раз при загрузке страницы).