Мы знаем, что WebSocket — это технология двусторонней связи между сервером и клиентом.Использование собственного WebSocket может свести к минимуму использование ресурсов сервера и предоставить унифицированный метод связи для обоих. Благодаря популярности HTML5 современные браузеры (IE10+) в основном изначально поддерживают WebSocket.Следующие браузеры поддерживают протокол WebSocket:
- Internet Explorer 10
- Firefox 6
- Chrome 14
- Safari 6.0
- Opera 12.1
- iOS Safari 6.0
- Хром для Android 27.0 Но как реализовать функцию WebSocket для старых браузеров? Вот несколько распространенных решений:
1. SockJS
SockJS — это библиотека JavaScript, которая предоставляет браузеру объект, подобный WebSocket. Во-первых, он будет предпочтительно использовать собственный WebSocket; если он не поддерживается, будет использоваться потоковая передача; если потоковая передача не поддерживается, будет использоваться опрос. Ниже приведен обзор поддерживаемых браузеров:
Поскольку имитируется двусторонняя связь WebSocket, при использовании SockJS также следует использовать соответствующую серверную библиотеку.Можно использовать следующие серверные библиотеки:- SockJS-node
- SockJS-erlang
- SockJS-tornado
- SockJS-twisted
- SockJS-ruby
- SockJS-netty
- SockJS-gevent (SockJS-gevent fork)
- SockJS-go
Использование клиента
Сначала загрузите библиотеку SockJS.
<script src="https://cdn.jsdelivr.net/npm/sockjs-client@1/dist/sockjs.min.js"></script>
После загрузки библиотеки вы можете установить соединение с сервером SockJS.
var sock = new SockJS('https://mydomain.com/my_prefix');
sock.onopen = function() {
console.log('open');
sock.send('test');
};
sock.onmessage = function(e) {
console.log('message', e.data);
sock.close();
};
sock.onclose = function() {
console.log('close');
};
Использование на стороне сервера (NodeJS)
Сначала установите sockjs-узел:
npm install sockjs
Затем вы можете общаться с клиентом, как WebSocket, прослушивая события.
var http = require('http');
var sockjs = require('sockjs');
var echo = sockjs.createServer({ sockjs_url: 'http://cdn.jsdelivr.net/sockjs/1.0.1/sockjs.min.js' });
echo.on('connection', function(conn) {
conn.on('data', function(message) {
conn.write(message);
});
conn.on('close', function() {});
});
var server = http.createServer();
echo.installHandlers(server, {prefix:'/echo'});
server.listen(9999, '0.0.0.0');
2. Socket.IO
Socket.IO может включать двустороннюю связь на основе событий, и для его использования также требуется создание соответствующего сервера; в первую очередь, он также предпочтет WebSocket, а если он его не поддерживает, будут использованы следующие альтернативы:
- Adobe Flash Socket (недостаток: требуется открытие дополнительного порта на сервере, по умолчанию 10843)
- Ajax long polling
- Ajax multipart streaming
- Forever iframe
- JSONP polling
Совместимость браузера
клиент
//加载Socket.IO库
<script src="http://localhost:8181/socket.io/socket.io.js"></script>
<script>
var socket = io.connect('http://localhost:8181');
console.log('a user connected');
socket.emit('my other event', { my: 'data' });
socket.on('disconnect', function(){
console.log('user disconnected');
});
</script>
Сервер
Установить socket.io
npm install socket.io --save
сервер конфигурации
var server = require('http').createServer();
var io = require('socket.io')(server);
io.on('connection', function(socket){
socket.emit('news', { hello: 'world' });
socket.on('event', function(data){});
socket.on('disconnect', function(){});
});
server.listen(3000);