我正在编写一个基于socket.io(v1.3.6)的简单聊天程序。当用户使用他们的用户名登录时,他们可以在仪表板中看到几个聊天室,并通过不同的端口输入每个聊天室,即
.st-content
。
用户可以在其中任何一个房间聊天。对于每个房间,我想创建一个活动的用户列表。 '有源'表示此用户现在已连接到套接字(在此房间聊天)。
我看到很多问题已经发布,但仍然被他们几个孤立的单词弄糊涂了。
在我当前的server.js中,我添加了以下代码:
http://localhost:8080/api/chats/room01
总结一下,有两个问题:
如何区分不同房间/端点的套接字连接?
如何为同一用户获取有效的用户名而不是var io = require('socket.io')(http);
io.on('connection', function(socket){
console.log('a user connected: ' + socket.id);
socket.on('disconnect', function(){
console.log(socket.id + ' has disconnected from the chat.');
});
});
?
非常感谢。
更新:
我的服务器端代码:
socket.id
我的客户端代码:
io.of('/rooms/room01').on('connection', function(socket) {
console.log("socket connected: ", socket.id);
//....some more codes
});
上述代码不起作用。但以前当我使用默认命名空间
时app.factory('socketio', ['$rootScope', function($rootScope) {
'use strict';
var socket = io.connect('http://localhost:8080/rooms/room01');
return {
on: function(eventName, callback) {
socket.on(eventName, function() {
var args = arguments;
$rootScope.$apply(function() {
callback.apply(socket, args);
});
});
},
emit: function(eventName, data, callback) {
socket.emit(eventName, data, function() {
var args = arguments;
$rootScope.$apply(function() {
if (callback) {
callback.apply(socket, args);
}
});
});
}
};
}]);
和
io.of('/').on('connection', function(socket) {
//...
}
效果很好。你能告诉我为什么吗?
答案 0 :(得分:3)
如何区分不同的套接字连接 房间/端点?
在您的服务器上,有几种方法可以列出每个房间的各种房间和插座。这里有一些关于您可以在服务器上访问的各种数据的信息,然后您可以决定哪种方法可以获得您想要的效果:
io.sockets.adapter.rooms
这是一个包含所有房间的对象,当前至少有一个连接。这包含服务器名为.join()
的两个房间,用于手动将套接字连接到房间,并包含每个套接字自动连接到的每个默认房间(带有socket.id的名称)。因此,如果您知道某个房间的名称为"test"
,那么您可以将每个房间的对象作为io.sockets.adapter.rooms['test']
的密钥。
io.sockets.connected
这是一个对象,包含当前连接的每个套接字,其中socket.id是对象中的键。因此,如果id为vlPYz3EHUOe8vFitAAAJ
,那么您可以将该id的套接字对象作为io.sockets.connected['vlPYz3EHUOe8vFitAAAJ']
来访问。显然,您可以使用for (var sock in io.sockets.connected)
类型的循环迭代所有连接的套接字。然后,在该套接字对象中,您可以看到它所在的房间:io.sockets.connected['vlPYz3EHUOe8vFitAAAJ'].rooms
这是一个房间名称数组。这个房间名称数组将包含与{同名的自动房间{1}}。
socket.id
这是一组连接的套接字,可能比使用io.sockets.sockets
更容易访问所有当前连接的套接字。与上一节中描述的一样,一旦有了给定的连接套接字,就可以访问io.sockets.connected
属性来获取套接字当前所在的房间数组。
对于特定套接字,您可以通过以下方式获取房间列表:
socket.rooms
这是给定套接字当前所在房间名称的数组。这包括与socket.rooms
同名的自动房间名称,因此如果只是尝试列出,您可能要忽略该房间名称插座所在的普通房间。
如何获取活动的usenames而不是socket.id 对于同一个用户有什么不同?
由于用户名是您分配的并且与socket.io无关,因此您必须找到一种方法将用户名与套接字自己关联。根据用户名的知晓位置,您可以在不同的地方执行此操作。如果它已经存在于cookie中,那么您可以从以下位置获取它:socket.id
这是在最初连接套接字时为此特定套接字设置的cookie的快照。
如果在最初连接套接字时以其他方式知道用户名,则可以从其他机制获取用户名并将其另存为套接字对象的属性:socket.handshake.headers.cookie
然后您可以访问它可以随时从服务器端套接字对象中获取。
这是我用来探索这些不同数据结构的一些服务器端诊断代码:
socket.username = 'xxx';