Socket.io入门
根据官方文档socket.io使用必须客户端根服务端一致,socket.io不兼容webSocket或者其他模块,因为socket.io在连接时做了自定义处理,
所以不同的长连接npm模块并不互通
首先安装npm包:
客户端(vue):
npm i socket.io-client@4.7.2
服务端(express):
npm i socket.io@4.7.2
因为socket.io不同版本之间使用方法有差异,本文写作时采用的是4.7.2版本
简单使用express.js+socket.io搭建一个服务器用来测试:
/**
* @file server.js
* */
import express from "express";
import { createServer } from "http";
import { Server } from "socket.io";
const app = express();
const httpServer = createServer(app);
const io = new Server(httpServer, {
cors: {
/* 需要指定,要不然本地调试过程中会产生跨域*/
origin: "*",
}
});
/* 这里就是当客户端socket连接到服务端socket的生命周期 */
io.on('connection',function(socket) {
/* io.emit(事件名,参数) */
io.emit('message','恭喜连接成功');
})
httpServer.listen(3000, () => console.log("run"));
/**
* @file client.js
* */
import {io} from 'socket.io-client'
/* 指定连接的地址 */
const socket = io('ws://localhost:3000');
socket.connect();
socket.on('message',message=>{
console.log('我是客户端,接收到了数据',message);
})
以上就是一个简单的socket.io通信的例子,下面记录一些常用用法,首先要了解socket.io基本概念
Socket.IO 中的每一个socket都由一个随机的、不可猜测的、唯一的标识符Socket#id。为了您的方便,每个socket都会自动加入一个由其自己的 id 标识的房间
房间是一个虚拟的仅存在于服务端的虚拟的概念,类似于分组的意思。
- 加入房间
socket.join(roomName);
- 离开房间
socket.leave(roomName);
- 查询当前连接是否已加入该房间
const room = io.sockets.adapter.rooms.get(roomName);
if (room && room.has(socket.id)) {
/* 已加入 */
}
- 发送消息给单个连接的客户端
io.in(socket.id).emit(事件名,参数)
- 在房间内发送广播
io.in(roomName).emit(事件名,参数)
- 获取房间内的连接数(promise)
await (io.in(roomName).fetchSockets()).length
写于2023年09月04日