Skip to content

基于Socket.io开发信令服务器

约 612 字大约 2 分钟

信令服务器socket.io实时通信

2025-05-08

什么是 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);
 }
}