nodejs(10.16)和express(4.16)后端服务器(服务器)与用于聊天应用程序的socket.io 2.2.0一起运行。在服务器上收到的消息将广播到连接到同一房间(通道)的客户端。 socket.io实例在index.js中创建:
const io = require('socket.io')(server);
io.on('connection', async (socket) => {
socket.my_id = "";
console.log("socket.id : ", socket.id);
app.set("socket", socket);
console.log("Socketio server is initialized");
//disconnect
socket.on('disconnect', async function() {
//if (socket.my_id) helper.RemoveSocketUser(user.fort_token, socket.my_id);
console.log('disconnected event');
});
});
server.listen(port, () => {};
然后,在将消息保存在服务器上之后,该套接字将用于向同一房间中的客户端广播。
try {
await msg.save();
msg.user_name = req.user.name;
msg.user_avatar = req.user.user_data.avatar;
const io = req.app.get("io");
const socket = req.app.get('socket');
const room = msg.event_id.toString();
socket.my_id = req.user.id;
socket.join(room);
console.log("socket in new message : ", socket.id);
console.log("msg before broadcast : ", msg.data.msg_body);
io.to(room).emit("event message", msg);
return res.status(200).send(req.body.data.msg_body);
} catch (err) {
console.log("Error in saving/braodcasting a new message", err);
return res.status(400).send(err.message);
};
从控制台输出中,连接到同一房间并聊天的2个客户端的socket.id相同。这是在端口8081上运行的Android模拟器的输出:
socket in new message : b0po9l6hGZUi9xVDAAAE
msg before broadcast : 8081
这是另一个在端口9090上运行的android模拟器:
socket in new message : b0po9l6hGZUi9xVDAAAE
msg before broadcast : 9090
但是,客户端的socket.id并不相同。是什么导致服务器对2个客户端使用相同的socket.id?
答案 0 :(得分:1)
您要尝试的是访问Express中存储的套接字对象, 每次连接新的套接字时都会更新套接字对象,这就是为什么您获得相同的套接字ID [上次连接]的原因。
要从io连接范围之外访问特定的套接字,必须从io
对象获取套接字实例。
您需要将套接字ID存储在数据库或内存中的某个位置,例如redis。
const socketid = `get user's latest connected socket id.`
cont socket = io.sockets.sockets[socketid];
socket.emit('req', { data: "something"})