最简单,最优雅的解决方案
就像这样简单:
client.emit("your message");
就是这样。
但是如何?给我一个例子
实际上,我们所有人都需要一个完整的示例,这就是下面的内容。这已在最新的socket.io版本(2.0.3)中进行了测试,并且还使用了现代Javascript(我们现在应该全部使用)。
该示例由两部分组成:服务器和客户端。每当客户端连接时,它就会开始从服务器接收一个周期性的序列号。为每个新客户端启动一个新序列,因此服务器必须单独跟踪它们。这就是“我需要向特定客户端发送消息”的地方。该代码很容易理解。让我们来看看它。
服务器
server.js
const
io = require("socket.io"),
server = io.listen(8000);
let
sequenceNumberByClient = new Map();
// event fired every time a new client connects:
server.on("connection", (socket) => {
console.info(`Client connected [id=${socket.id}]`);
// initialize this client's sequence number
sequenceNumberByClient.set(socket, 1);
// when socket disconnects, remove it from the list:
socket.on("disconnect", () => {
sequenceNumberByClient.delete(socket);
console.info(`Client gone [id=${socket.id}]`);
});
});
// sends each client its current sequence number
setInterval(() => {
for (const [client, sequenceNumber] of sequenceNumberByClient.entries()) {
client.emit("seq-num", sequenceNumber);
sequenceNumberByClient.set(client, sequenceNumber + 1);
}
}, 1000);
服务器开始在端口8000上侦听传入连接。当一个到达时,它将新客户端添加到映射中,以便它可以跟踪其序列号。disconnect
当该客户端将其从地图中删除时,它还会侦听该客户端的事件。
每一秒钟,都会触发一个计时器。完成后,服务器将遍历该映射,并以其当前序列号向每个客户端发送一条消息。然后将其递增,并将数字存储回地图中。仅此而已。十分简单。
客户
客户端部分甚至更简单。它只是连接到服务器并监听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
npm install socket.io-client
运行服务器:
node server
打开其他终端窗口,并通过运行生成任意数量的客户端:
node client
我也准备与全电码梗概这里。