我正在使用nodejs服务器在socket.io上写一个简单的聊天...所以我需要知道哪个房间插座是。例如,套接字已连接,服务器将其扔到某个房间。因此,当这个套接字发送消息时,我需要将它广播到this.socket会议室的所有套接字(sck.broadcast.to(it_room).emit)。
io.on("connection", function(sck) {
...
sck.join(avalibleRoom);
sck.on("message", function(msg) {
sck.broadcast.to(**it room**).emit(msg);
sck.emit(msg);
});
...
});
我不需要套接字数组和有关它们的信息(在哪个房间等)。 抱歉我的英文不好
答案 0 :(得分:0)
尝试使用以下内容,但我不确定它是否适用于所有情况。
Object.keys(sck.manager.roomClients[sck.id])[1]
我通过记录套接字找到了这个,然后我查找房间信息并以我在代码中看到的方式提取它。
我使用的是0.9.6 socket.io版本,也许最新版本有不同的解决方案。
答案 1 :(得分:0)
您首先输入您的用户名和加入的聊天室。提交表单后,用户名和房间信息将作为查询字符串附加到URL后面。在浏览器中:location.search:这是我们查询字符串的方式。我们必须解析它。
将此CDN添加到您的main.html
<script src="https://cdnjs.cloudflare.com/ajax/libs/qs/6.6.0/qs.min.js"></script>
此CDN for npm querystringify软件包。由于在客户端设置npm软件包会很麻烦,因此cdn更易于处理。确保小时HTML中的CDN脚本文件应先加载,然后再加载其他js文件。加载此CDN之后,我们可以使用:
const { username, room } = Qs.parse(location.search, { ignoreQueryPrefix: true })
{ignoreQueryPrefix:true}此选项将省略“?”来自查询字符串。
一旦您到达用户名和房间名称,我们就可以从客户端发出事件。
client.js
socket.emit('join', { username, room }, (error) => {
if (error) {
alert(error)
location.href = '/' //will keep the client in the same url
}
})
现在我们必须从服务器端监听此事件。但我们必须跟踪用户。
index.js
io.on("connection", socket => {
socket.on("join", ({ username, room }, callback) => {
//we have to define addUser function
let users = [];
const addUser = ({ id, username, room }) => {
// Clean the data
username = username.trim().toLowerCase();
room = room.trim().toLowerCase();
// Validate the data
if (!username || !room) {
return {
error: "Username and room are required!"
};
}
// Check for existing user
const existingUser = users.find(user => {
return user.room === room && user.username === username;
});
// Validate username
if (existingUser) {
return {
error: "Username is in use!"
};
}
// Store user
const user = { id, username, room };
users.push(user);
// users=users.push(user) this will cause error
return { user };
};
//as you see this function will return either error or user object
//Socket generates an id upon connection.
//result is either error or user
const { error, user } = addUser({ id: socket.id, username, room });
if (error) {
return callback(error);
}
socket.join(user.room);//socket joined to this room
//now time to emit a new event
socket.emit("message", ( "Welcome!"));
socket.broadcast
.to(user.room)
.emit(
"message",
(`${user.username} has joined!`)
);
//broadcast will send messages to everyone in the chat room except the connected socket
callback(); //success scenario. let the client knows that it is allowed to connect
})
})