我是nodejs新手,正在尝试像很多人一样编写一个聊天室。 聊天由多个房间和客户端组成。诸如
/nick
/join
/help
/ls users
/ls rooms
之类的命令可以按您的预期工作,尽管我在使用 /kick
命令时遇到了麻烦。
我只是不确定如何通过 id 断开客户端连接,到目前为止
/kick client
能够提供相应的客户端 socket.id,尽管我一直在等待代码通过 socket.id 启动。
到目前为止的代码:
断开发送
/kick
的客户端:socket.disconnect();
从 arg /kick client
删除客户端:
delete io.sockets.sockets[client];
删除客户端并不会断开它们的连接,它们仍然可以接收数据,只是不能发送数据。
CuriousGuy 的 0.9 运行完美,对于那些感兴趣的人 - 这是我正在使用的代码。
服务器端:
handleClientKick(socket);
...
function handleClientKick(socket) {
socket.on('kick', function(client) {
if (typeof io.sockets.sockets[client] != 'undefined') {
socket.emit('message', {text: nickNames[socket.id] + ' kicked: ' + nickNames[client]});
io.sockets.sockets[client].disconnect();
} else {
socket.emit('message', {text: 'User: ' + name + ' does not exist.'});
}
});
}
客户端:
kickClient = function(client) {
this.socket.emit('kick', client);
};
以下代码适用于 Socket.IO 1.0,但我不确定这是最好的解决方案:
if (io.sockets.connected[socket.id]) {
io.sockets.connected[socket.id].disconnect();
}
更新:
对于 Socket.IO 0.9,代码会略有不同:
if (io.sockets.sockets[socket.id]) {
io.sockets.sockets[socket.id].disconnect();
}
这是一个老问题,但如果有人想知道新版本;
在 Socket.IO v4.X
io.sockets.connected[socket.id]
或 io.sockets.sockets[socket.id]
中不起作用。
所以我们需要这样做;
io.sockets.sockets.forEach((socket) => {
// If given socket id is exist in list of all sockets, kill it
if(socket.id === givenSocketID)
socket.disconnect(true);
});
Socket.IO v4.X
中的替代解决方案适用于所有插座
const sockets = await io.fetchSockets();
针对特定插座
const sockets = await io.in(theSocketId).fetchSockets();
迭代套接字
for (const socket of sockets) {
console.log("socket id",socket.id);
socket.disconnect(true);
}
这是 Socket.IO v4 的另一个选项,不需要异步语法:
io.sockets.sockets.get(socket.id)
如果错误的话有人可以纠正,但我认为每个套接字都有一个唯一的ID,所以应该不需要迭代。
服务器:
var users = {};
socket.on("identify", (username, id) => {
eval("users." + username + " = " + '"' + socket.id + '"')
});
socket.on("getId", (username) => {
console.log(eval("users." + username))
});
socket.on("kick", (username) => {
io.sockets.sockets.forEach((socket) => {
if(socket.id === eval("users." + username))
socket.disconnect(true);
});
})
客户:
const username = prompt("What Is Your Name?")
socket.emit("identify", username)
说明: 当客户端进入网页时,他们会被问到他们的名字是什么,然后它将名称发送到服务器,然后服务器获取客户端的 id 并将该名称存储在对象“用户”中,并为其提供 id 值。 users.name = 用户的 socket.ID' 然后当您在客户端的控制台中写入 'socket.emit("kick", 用户的用户名)' 时,它会断开该用户与套接字的连接,以便他们无法再聊天直到他们重新加载,所以这几乎将他们从聊天中踢了出来。
const usersocket = io.sockets.sockets.get("socketid");
userSocket?.disconnect();
//emit socket event....