socket.io切换命名空间
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了socket.io切换命名空间相关的知识,希望对你有一定的参考价值。
我目前正在与socket.io进行简单的聊天。基础知识已经有效,但现在我正在尝试实现2个不同的命名空间。我希望客户端能够通过按钮点击从一个命名空间(支持聊天)切换到另一个(朋友聊天)。
服务器端
//default namespace
io.on('connection', function(socket){
console.log('a user connected to the chat');
socket.on('disconnect', function(){
console.log('user disconnected');
});
socket.on('client message', function(msg){
io.emit('server_message', msg);
});
});
//namespace /support
var sup = io.of('/support');
sup.on('connection', function(socket){
console.log('someone entered the support-chat');
socket.on('disconnect', function(){
console.log('user disconnected from support-chat');
});
//recieving and emitting message to all clients in namespace /support
socket.on('client message', function(msg){
console.log('message received: ' + msg);
io.of('/support').emit('server_message', msg);
});
});
//namespace /friends
var frnd = io.of('/friends');
frnd.on('connection', function(socket){
console.log('someone entered the friends-chat');
socket.on('disconnect', function(){
console.log('user disconnected from friends-chat');
});
//recieving and emitting message to all clients in namespace /friends
socket.on('client message', function(msg){
console.log('message received: ' + msg);
io.of('/friends').emit('server_message', msg);
});
});
客户端
var socket = io.connect();
//toggle namespace
$("#support_button").click(function(){
socket.disconnect();
socket = io('/support');
$('#messages').append($('<li>').text("You entered the Support-Chat"));
});
//toggle namespace
$("#friends_button").click(function(){
socket.disconnect();
socket = io('/friends');
$('#messages').append($('<li>').text("You entered the Friends-Chat"));
});
//sending message on submit
$('form').submit(function(){
socket.emit('client message', $('#m').val());
$('#m').val('');
return false;
});
//recieving message and display
socket.on('server_message', function(msg){
$('#messages').append($('<li>').text(msg));
});
});
我认为交换机本身正在工作,因为连接和断开事件正在触发它们应该如此。但是当涉及将消息(已经从客户端收到的服务器)发送给同一命名空间中的每个人时,它无法正常工作。
这不是在特定命名空间中发出的服务器调用吗?:
io.of('namespace').emit();
我是否误解了命名空间的用法?我想在命名空间之后立即实现房间 - “分割”2个主板以供支持和朋友使用。或者我在服务器端实现了错误的命名空间?我以为io.on(..),io.of('/ support')。on(..)和io.of('/ friends')。on(..)都以同样的方式工作并抓住他们自己的命名空间 - 客户端的事件。
任何帮助都非常感谢!我觉得名称空间在“基本用法”文档中被忽略了。
您无法在现有连接上“切换”命名空间。在建立连接时连接到特定的命名空间,一旦建立连接,就无法更改。
您可以删除当前连接并使用新连接连接到新命名空间。但是,考虑到您的应用程序,如果您想切换名称空间并且应该使用房间,则会滥用名称空间的概念。
对于房间,客户端可以向服务器发送切换房间的请求,然后服务器可以从现有房间中移除用户并将其添加到新房间。然后,从服务器,您可以轻松地广播到给定房间中的所有连接。
事实上,房间是围绕聊天概念发明的(虽然它们有许多其他用途),因此它们非常适合您希望实施的聊天室。
命名空间比房间更重。连接必须在建立连接时连接到特定的命名空间,并且在连接期间无法更改。
另一方面,房间更灵活。服务器可以在任何时间将给定连接添加或从房间中删除连接,并且连接甚至可以在多个房间中。
房间和名称空间都支持向该集合中的所有用户广播。
我认为名称空间更像是功能渠道。所以,我想连接到“价格”更改命名空间,以获取价格变化的通知,或者我连接到“系统”命名空间,以获取有关系统中发生的事情的警报或发送消息管理系统中的事物。
而房间是任意有兴趣共享信息的用户集合,而我可能在不止一个房间。
以上是关于socket.io切换命名空间的主要内容,如果未能解决你的问题,请参考以下文章