官方介绍(链接)
Socket.io是一个WebSocket库,会自动根据浏览器从WebSocket、AJAX长轮询、Iframe流等等各种方式中选择最佳的方式来实现网络实时应用,而且支持的浏览器最低达IE5.5。 Socket.io 服务器 和 Socket.io 客户端之间全双工通信信道
尽可能使用WebSocket 连接建立(”尽可能“就说明要求客户端和服务端都必须使用,HTTP 长轮询`作为后备。 在了解socket-io前,我们先了解三种通信方式和Http轮询。
三种通信方式
全双工通信、单工通信、半双工通信都属于通信信道,提供传输数据的途径。
Http 短轮询、长轮询
早期网站进行数据推送的技术基本都是基于Http轮询。轮询是指客户端每隔一段时间向服务器端发送请求,服务器端接收到客户端请求后返回数据给客户端。客户端轮询的方式有两种:短轮询、长轮询。
socket-io
npm install socket-io -S
npm install express@4 -S
监听服务器建立连接和断开连接
io.on('connection', socket => {
console.log('a user connected!');
//disconnect
socket.on('disconnect', () => {
console.log('a user disconnected!');
})
}
向全体人员广播
io.sockets.emit(自定义参数,data);
向全体人员广播
io.emit(自定义参数, data);
发送信息
socket.emit(自定义参数,data)
接收信息
socket.on(自定义参数,callback)
用户断开连接触发事件
socket.on('disconnect',callback);
信息传输对象为排除当前socket 对应的 client 的其他client
socket.broadcast.to(socketId ).emit('msg', msg)
向某房间发送消息
io.to(roomId).emit('event name', {
// some data
})
加入/离开房间
// join room
socket.join(roomId);
// leave room
socket.leave(roomId);
服务端代码
const express = require('express');
const app = express();
const http = require('http');
const server = http.createServer(app);
// Express 初始化app可以提供给HTTP服务器的函数处理程序
const { Server } = require("socket.io");
const io = new Server(server);
// socket.io自动为我们服务客户端传递server(HTTP 服务器)对象来初始化 的新实例。然后我监听connection传入套接字的事件并将其记录到控制台
app.get('/', (req, res) => {
res.sendFile(__dirname + '/index.html');
});
let roomInfo = {};
let users = [];
io.sockets.on('connection', socket => {
socket.on('disconnect', () => {
console.log(`客户端断开链接`)
})
socket.on('login', user => {
if (-1 != users.indexOf(user)) {
return false;
}
users.push(user)
io.sockets.emit('login', user)
io.sockets.emit('updateUserList', users)
})
socket.on('chat', data => {
console.log(data, 'data')
io.sockets.emit('chat', data)
})
socket.on('creatGroup', data => {
if (!(data.roomId in roomInfo)) {
roomInfo[data.roomId] = data;
}
io.sockets.emit('creatGroup', data.roomId)
})
})
server.listen(3000, () => {
console.log('listening on *:3000');
});
<script src="/socket.io/socket.io.js"></script>
<script>
socket = io.connect();
//登录
loginDom.addEventListener('click', () => {
let user = userDom.value.trim();
if (!user) {
alert('用户名为空')
return
}
socket.emit('login', user, 1)
})
// 创建群组
creatGroupDom.addEventListener('click', () => {
let user = userDom.value.trim();
let group = { user, roomId: `room_id_${(Date.now())}` }
socket.emit('creatGroup', group)
})
// 监听创建群组
socket.on('creatGroup', data => {
creatGroupDom.innerHTML = `<dt>群组列表</dt>`
})
//服务器连接提示
socket.on('connect', () => {
addMsg(roomNoticeDom, `服务器连接成功`)
})
//登录
socket.on('login', (user) => {
addMsg(roomNoticeDom, `${user}进入房间`)
document.getElementById('user').disabled = true;
})
//更新用户列表
socket.on('updateUserList', users => {
userListDom.innerHTML = `<dt>用户列表</dt>`
// userListDom.removeChild(ddDom)
for (let user of users) {
let dd = document.createElement('dd')
dd.innerText = user;
userListDom.appendChild(dd)
}
})
//监听消息
socket.on('chat', (data) => {
console.log('接收到消息')
var item = document.createElement('li');
item.style.background = '#ff0'
item.textContent = `${data.user}说:${data.message}`;
messages.appendChild(item);
window.scrollTo(0, document.body.scrollHeight + 30);
})
//发送消息
form.addEventListener('submit', (e) => {
e.preventDefault();
if (message.value) {
console.log(message, user, '发送信息成功')
socket.emit('chat', { message: message.value, user: userDom.value.trim() })
}
message.value = '';
})
</script>
我正在参与2023腾讯技术创作特训营第三期有奖征文,组队打卡瓜分大奖!
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。