POSTS
基于Socket.io开发信令服务器
什么是 socket.io
一个 js 库,用来建立长链接,默认使用 WebSocket,次选 Http 长轮询
什么是信令服务器
一般指 WebRtc 的一个概念,由于 WebRtc 通过 P2P 进行连接,所以需要一台服务器用来交换双方的网络地址信息,在交换信息后用户的数据流就使用 P2P 传输,所以不必担心消耗过多公网流量
能做什么
实现双向、实时、基于事件的通信。这里我们利用这个特性制作信令服务器
Socket.io 官方文档
Node.js 使用包管理器安装socket.io
,这个是服务端库、socket.io-client
是客户端库,本文针对服务端
前置:Web 应用框架(例如:express
)
可选:
- 日志框架(例如:
winston
) - 服务管理(例如:
pm2
) - 数据库(例如:
better-sqlite3
(需要编译))
通信格式一般以数组为单位:[“事件名”,“数据内容”]
// 通过emit发送消息,默认向全部连接实例发送
socket.emit("message", "Hello from Socket.IO!");
// 指定方向,默认每一个连接都加入了一个房间,向用户默认的那个房间发消息就可以实现私聊等功能
io.to(ID).emit("point", data);
// 监听服务
socket.on("joinroom", (data) => {
// 可在此处编写业务逻辑
});
配置例子
export default {
PORT: 1145,
// 服务器配置
SOCKET_SETTINGS: {
transports: ["websocket"],
allowEIO3: true,
pingTimeout: 50000,
pingInterval: 15000,
maxHttpBufferSize: 1e8,
cors: {
origin: "*",
methods: ["GET", "POST"],
},
},
};
创建服务器的函数
/**
* 创建 Socket.IO 服务器实例
* @param {number} port - 服务器监听端口
* @param {Object} config - Socket.IO 配置项
* @returns {Server} Socket.IO 服务器实例
*/
export function createIoServer(port, config) {
try {
const app = new express();
// 修正 HTTP 服务器创建方式
const httpServer = createServer(app);
// 合并配置并创建唯一的 Socket.IO 实例
const io = new Server(httpServer, config);
// 监听底层HTTP服务器事件
httpServer.listen(port);
io.httpServer.on("listening", () => {
console.log(`服务已启动在端口:${io.httpServer.address().port}`);
});
// 监听错误事件
io.on("error", (err) => {
console.log("Socket.IO服务启动失败:", err);
});
return io;
} catch (err) {
console.log("Socket.IO服务启动失败:", err);
throw err; // 抛出错误以便外层捕获
}
}
开启服务的函数
/**
* 开启 Socket.IO 事件监听
* @param {Server} io - Socket.IO 服务器实例
*/
export function Start(io) {
try {
io.on("connection", (socket) => {
socket.emit("message", "Hello from Socket.IO!");
//可以在这里添加自定义的服务
});
} catch (err) {
console.log("Socket.IO服务启动出错:", err);
}
}