socket.io-无法将消息发送到套接字中的特定房间

时间:2020-09-21 12:11:21

标签: javascript android socket.io

我正在尝试设置节点服务器以使用新信息实时更新所有连接的客户端。当我运行下面的代码时,io.sockets.on('connection')回调会不断触发,并向控制台充斥消息Client connected!,并且不会从socket.emit()更新前端。我在做什么错了?

const port = process.env.PORT || 3000;
const app = require('http').createServer(function (req, res) {
});
app.listen(port);
const io = require('socket.io').listen(app, () => {
console.log('Server listening at port %d %s', port);
});

const pool = require('./socketMySql');
let numUsers = 0;
const users = {};


io.on('connection', (socket) => {
let addedUser = false;
socket.on('joinToClass', (classroom_id) => {
    const isArray = (classroom_id.toString().startsWith("["));
    if (isArray)
        classroom_id = JSON.parse(classroom_id);
    socket.join(parseInt(classroom_id), function () {
        let rooms = Object.keys(socket.rooms);
        console.log("joinToClass " + classroom_id + " rooms " + rooms);
    });
});

socket.on('leaveTheClass', (classroom_id) => {
    const isArray = (classroom_id.toString().startsWith("["));
    if (isArray)
        classroom_id = JSON.parse(classroom_id);
    socket.leave(classroom_id, function () {
        console.log("Socket now leave The Class " + classroom_id);
    });
});

// when the client emits 'add user', this listens and executes
socket.on('add user', (data) => {
    if (addedUser) return;
    data = JSON.parse(data);
    // we store the username in the socket session for this client
    socket.username = data.name;
    socket.family = data.family;
    socket.id = data.id;
    ++numUsers;
    addedUser = true;
    users[socket.id] = data.id;       
    // echo globally (all clients) that a person has connected
    socket.broadcast.emit('user joined', {
        username: socket.username,
        numUsers: numUsers,
        userId: socket.id
    });
});

// when the client emits 'typing', we broadcast it to others
socket.on('typing', async (data) => {
    data = JSON.parse(data);
    const classroomId = data.classroom_id;
    const typingData = {
        classroom_id: classroomId,
        userId: data.userId,
        exam_id: data.exam_id
    };
    io.sockets.in(parseInt(classroomId)).emit('typing', typingData);   //<==   NOT WORK
});

// when the client emits 'stop typing', we broadcast it to others
socket.on('stop typing', (data) => {
    data = JSON.parse(data);
    const classroomId = data.classroom_id;
    io.sockets.in(classroomId).emit('stop typing', { //<==   NOT WORK
        classroom_id: classroomId,
        userId: data.userId,
        exam_id: data.exam_id
    });      
});

// when the user disconnects.. perform this
socket.on('disconnect', () => {
    if (addedUser) {
        --numUsers;
        delete users[socket.id];      
        // echo globally that this client has left
        socket.broadcast.emit('user left', {
            username: socket.username,
            numUsers: numUsers,
            userId: socket.id
        });
    }
});
//just added
socket.on("error", (err) => {
        console.log("Caught flash policy server socket error: " + err.stack);
    }
)
});

在用户在线时,在客户端中的第一个呼叫add user事件。

当用户选择班级时,将调用事件joinToClass来执行操作socket.join

事件typing在用户参加考试时被调用,我想让其他班级成员知道正在参加考试。

0 个答案:

没有答案