最简单、最优雅的方法
已验证可与socket.io v3.1.1一起使用
只需要这样:
client.emit("your message")
就是这样。好的,但它是如何工作的?
最小工作示例
这是一个简单的客户端-服务器交互示例,其中每个客户端定期接收包含序列号的消息。对于每个客户端都有一个唯一的序列号,这就是“我需要发送消息到特定客户端”的地方。
服务器
server.js
const
{Server} = require("socket.io"),
server = new Server(8000);
let
sequenceNumberByClient = new Map();
server.on("connection", (socket) => {
console.info(`Client connected [id=${socket.id}]`);
sequenceNumberByClient.set(socket, 1);
socket.on("disconnect", () => {
sequenceNumberByClient.delete(socket);
console.info(`Client gone [id=${socket.id}]`);
});
});
setInterval(() => {
for (const [client, sequenceNumber] of sequenceNumberByClient.entries()) {
client.emit("seq-num", sequenceNumber);
sequenceNumberByClient.set(client, sequenceNumber + 1);
}
}, 1000);
服务器开始监听8000端口的传入连接。一旦建立新连接,该客户端将被添加到保持其序列号的映射中。服务器还监听“断开”事件,以便在客户端离开时从映射中删除该客户端。
每秒钟,计时器都会触发。当它发生时,服务器遍历映射,并向每个客户端发送一个消息,其中包含其当前序列号,并立即递增该序列号。这就是全部内容。非常简单易行。
客户端部分甚至更简单。它只需连接到服务器并监听“seq-num”消息,每次收到消息都将其打印到控制台上。
"client.js"
const
io = require("socket.io-client"),
ioClient = io.connect("http://localhost:8000");
ioClient.on("seq-num", (msg) => console.info(msg));
运行示例
安装所需的库:
npm install socket.io@3.1.1 socket.io-client@3.1.1
运行服务器:
node server
通过运行以下命令,打开其他终端窗口并生成任意数量的客户端:
Open other terminal windows and spawn as many clients as you want by running:
node client
我还准备了一个包含完整代码的 gist,在这里。
io.of('/mynamespace').sockets[socketID].emit(...)
(不知道是不是因为我在使用命名空间)。 - Adrien Schuler^
类型错误:未定义的函数 在 Object.<anonymous> (C:\Users\Dev\Desktop\nouty-server\server.js:108:14) 在 Module._compile (module.js:460:26) 在 Object.Module._extensions..js (module.js:478:10) 在 Module.load (module.js:355:32) 在 Function.Module._load (module.js:310:12) 在 Function.Module.runMain (module.js:501:10) 在 startup (node.js:129:16) 在 node.js:814:3 - Lucas Bertolloio.sockets.socket(socket_id)
已被移除。详情请参见https://github.com/socketio/socket.io/issues/1618#issuecomment-46151246。 - ImMathan