Чтобы прочитать больше статей из этой серии, пожалуйста, посетите мойБлог GitHub, пример кода, пожалуйста, посетитездесь.
Преимущества веб-сокетов
-
Высокая производительность.
В зависимости от данных тестовой среды он будет примерно в 2-10 раз выше, чем обычные Ajax-запросы. HTTP — это текстовый протокол, и объем данных относительно велик.
WebSocket — это бинарный протокол, хотя при установлении соединения используются текстовые данные, все бинарные данные передаются позже, поэтому производительность выше, чем у Ajax-запросов.
-
Двусторонняя связь.
Если это обычный запрос Ajax, данные необходимо получать в режиме реального времени, а запрос можно отправлять только регулярно с таймером, что приведет к трате ресурсов сервера и трафика.
С помощью WebSocket сервер может активно отправлять информацию внешнему интерфейсу.
-
Строгий режим
Из-за позднего появления WebSocket, по сравнению с протоколом HTTP, безопасность рассматривается более полно.
Затем попытайтесь установить двустороннюю связь на основе WebSocket с Socket.io.
Socket.io
Socket.io является распространенным использованием библиотеки WebSocket, он определяется автоматически с помощью браузеров WebSocket, поддерживающих WebSocket, другие браузеры, такие как flash и т. д., будут использоваться для завершения связи.
- легко использовать
- Совместимость с младшими браузерами, такими как IE6
- Автоматизируйте анализ данных
- Автоматическое переподключение Если соединение разорвано, WebSocket автоматически переподключится.
Создание приложения WebSocket с использованием Socket.io
Пример кода на стороне сервера: /lesson19/server.js
const http = require('http')
const io = require('socket.io')
// 1. 建立HTTP服务器。
const server = http.createServer((req, res) => {
})
server.listen(8080)
// 2. 建立WebSocket,让socket.io监听HTTP服务器,一旦发现是WebSocket请求,则会自动进行处理。
const ws = io.listen(server)
// 建立连接完成后,触发connection事件。
// 该事件会返回一个socket对象(https://socket.io/docs/server-api/#Socket),可以利用socket对象进行发送、接收数据操作。
ws.on('connection', (socket) => {
// 根据事件名,向客户端发送数据,数据数量不限。
socket.emit('msg', '服务端向客户端发送数据第一条', '服务端向客户端发送数据第二条')
// 根据事件名接收客户端返回的数据
socket.on('msg', (...msgs) => {
console.log(msgs)
})
// 使用计时器向客户端发送数据
setInterval(() => {
socket.emit('timer', new Date().getTime())
}, 500);
})
Образец кода клиента: /lesson19/index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
</head>
<body>
<!-- 引用Socket.io的客户端js文件,由于Socket.io已在服务端监听了HTTP服务器的请求,一旦收到对该文件的请求,则会自动返回该文件,不需要开发人员配置。 -->
<!-- 该文件在服务端的位置为/node_modules/socket.io/node_modules/socket.io-client/dist/socket.io.js -->
<script src="http://localhost:8080/socket.io/socket.io.js"></script>
<script>
// 与服务器建立WebSocket连接,该连接为ws协议,socket.io不需要担心跨域问题。
const socket = io.connect('ws://localhost:8080/')
// 根据事件名,向服务端发送数据,数据数量不限。
socket.emit('msg', '客户端向服务端发送数据第一条', '客户端向服务端发送数据第二条')
// 根据事件名接收服务端返回的数据
socket.on('msg', (...msgs) => {
console.log(msgs)
})
// 接收服务端通过计时器发送来的数据
socket.on('timer', (time) => {
console.log(time)
})
</script>
</body>
</html>
Откройте index.html в браузере, и вы увидите распечатанное сообщение на консоли.