解决客户和房间 - 从 socket.io 0.9 迁移到 +1.x
Resolve Clients and rooms - Migration from socket.io 0.9 to +1.x
我正在尝试改编一段用 socket.io 0.9 编码的代码,returns 特定房间中的客户列表和房间列表(典型的聊天室示例)
房间内的用户
var usersInRoom = io.sockets.clients(room);
房间列表
socket.on('rooms', function() {
var tmp = io.sockets.manager.rooms;
socket.emit('rooms', tmp);
});
tmp 看起来像这样
{
0: Array[1],
1: /Lobby: Array[1]
}
所以我可以在浏览器上用 javascript 运行 在客户端显示列表。
socket.on('rooms', function(rooms) {
$('#room-list').empty();
debugger;
for(var room in rooms) {
room = room.substring(1, room.length);
if (room != '') {
$('#room-list').append(divEscapedContentElement(room));
}
}
$('#room-list div').click(function() {
chatApp.processCommand('/join ' + $(this).text());
$('#send-message').focus();
});
});
但是对于 >1.x 版本,我发现 clients/rooms 发生了变化。
按照我在此处找到的一些链接,我可以通过以下方式设法获得房间列表:
socket.on('rooms', function(){
var tmp = socket.rooms;
socket.emit('rooms', tmp);
});
这里的问题是 socket.rooms
returns
{
0: "RandomString",
1: "Lobby",
length: 2
}
我只需要通过 'Lobby' 房间。我不知道随机字符串来自哪里。
编辑
通过我发现的一些调试,随机字符串是 socket.id ...这种行为正常吗?还房间和socket.id一起?
已更新
我终于有了一些结果
房间内的用户
var usersInRoom = getUsersByRoom('/', room);
function getUsersByRoom(nsp, room) {
var users = []
for (var id in io.of(nsp).adapter.rooms[room]) {
users.push(io.of(nsp).adapter.nsp.connected[id]);
};
return users;
};
房间列表
function getRooms(io){
var allRooms = io.sockets.adapter.rooms;
var allClients = io.engine.clients;
var result = [];
for(var room in allRooms){
// check the value is not a 'client-socket-id' but a room's name
if(!allClients.hasOwnProperty(room)){
result.push(room);
}
}
return result;
}
实现结果的更好、更直接的方法?
这些是我检查过的链接:
How to get room's clients list in socket.io 1.0
socket.io get rooms which socket is currently in
看来没有更好的办法了,就用我自己的答案吧。如果你们有更好的解决方案,我会更新已接受的解决方案。
房间内的用户
var usersInRoom = getUsersByRoom('/', room);
function getUsersByRoom(nsp, room) {
var users = []
for (var id in io.of(nsp).adapter.rooms[room]) {
users.push(io.of(nsp).adapter.nsp.connected[id]);
};
return users;
};
房间列表
function getRooms(io){
var allRooms = io.sockets.adapter.rooms;
var allClients = io.engine.clients;
var result = [];
for(var room in allRooms){
// check the value is not a 'client-socket-id' but a room's name
if(!allClients.hasOwnProperty(room)){
result.push(room);
}
}
return result;
}
我正在尝试改编一段用 socket.io 0.9 编码的代码,returns 特定房间中的客户列表和房间列表(典型的聊天室示例)
房间内的用户
var usersInRoom = io.sockets.clients(room);
房间列表
socket.on('rooms', function() {
var tmp = io.sockets.manager.rooms;
socket.emit('rooms', tmp);
});
tmp 看起来像这样
{
0: Array[1],
1: /Lobby: Array[1]
}
所以我可以在浏览器上用 javascript 运行 在客户端显示列表。
socket.on('rooms', function(rooms) {
$('#room-list').empty();
debugger;
for(var room in rooms) {
room = room.substring(1, room.length);
if (room != '') {
$('#room-list').append(divEscapedContentElement(room));
}
}
$('#room-list div').click(function() {
chatApp.processCommand('/join ' + $(this).text());
$('#send-message').focus();
});
});
但是对于 >1.x 版本,我发现 clients/rooms 发生了变化。 按照我在此处找到的一些链接,我可以通过以下方式设法获得房间列表:
socket.on('rooms', function(){
var tmp = socket.rooms;
socket.emit('rooms', tmp);
});
这里的问题是 socket.rooms
returns
{
0: "RandomString",
1: "Lobby",
length: 2
}
我只需要通过 'Lobby' 房间。我不知道随机字符串来自哪里。
编辑 通过我发现的一些调试,随机字符串是 socket.id ...这种行为正常吗?还房间和socket.id一起?
已更新
我终于有了一些结果
房间内的用户
var usersInRoom = getUsersByRoom('/', room);
function getUsersByRoom(nsp, room) {
var users = []
for (var id in io.of(nsp).adapter.rooms[room]) {
users.push(io.of(nsp).adapter.nsp.connected[id]);
};
return users;
};
房间列表
function getRooms(io){
var allRooms = io.sockets.adapter.rooms;
var allClients = io.engine.clients;
var result = [];
for(var room in allRooms){
// check the value is not a 'client-socket-id' but a room's name
if(!allClients.hasOwnProperty(room)){
result.push(room);
}
}
return result;
}
实现结果的更好、更直接的方法?
这些是我检查过的链接:
How to get room's clients list in socket.io 1.0
socket.io get rooms which socket is currently in
看来没有更好的办法了,就用我自己的答案吧。如果你们有更好的解决方案,我会更新已接受的解决方案。
房间内的用户
var usersInRoom = getUsersByRoom('/', room);
function getUsersByRoom(nsp, room) {
var users = []
for (var id in io.of(nsp).adapter.rooms[room]) {
users.push(io.of(nsp).adapter.nsp.connected[id]);
};
return users;
};
房间列表
function getRooms(io){
var allRooms = io.sockets.adapter.rooms;
var allClients = io.engine.clients;
var result = [];
for(var room in allRooms){
// check the value is not a 'client-socket-id' but a room's name
if(!allClients.hasOwnProperty(room)){
result.push(room);
}
}
return result;
}