所谓命名空间,就是指在不同的域当中发消息只能给当前的域的socket收到。 下面来看一个实例。
看下客户端的代码:
<script src="/socket.io/socket.io.js"></script>
var chat = io.connect('http://localhost:3000/chat');
var news = io.connect('http://localhost:3000/news');
chat.on('chat message', function (msg) {
console.log(msg + ' from chat client');
chat.emit('chat client', 'chat client');
});
news.on('chat message', function (msg) {
console.log(msg + ' from news client');
news.emit('chat client', 'news client');
})
</script>
这里面有两个命名空间,一个是chat, 一个是news, 他们都监听服务端 ‘chat message’的事件,虽然事件名相同,但是在服务端,不同的命名空间里,事件内容设置不同。
并且都发出‘chat client’ 的事件,不过事件的内容不一样。
再来看下服务端的代码:
var app = require('express')();
var http = require('http').createServer(app);
var io = require('socket.io')(http);
app.get('/', function (req, res) {
res.sendFile(__dirname + '/chat.html');
});
var chat = io
.of('/chat')
.on('connection', function (socket) {
socket.on('chat client', function (msg) {
console.log(msg + ' from namespace ' + socket.nsp.name); //接收当前命名空间的消息
});
socket.emit('chat message', 'in namespace ' + socket.nsp.name + ' for sender'); //在当前命名空间下,向sender发出消息
chat.emit('chat message', 'in namespace ' + socket.nsp.name + ' for everyone');//在当前命名空间下,向所有客户端广播消息
});
var news = io
.of('/news')
.on('connection', function (socket) {
socket.on('chat client', function (msg) {
console.log(msg + ' from namespace ' + socket.nsp.name); //接收当前命名空间的消息
});
socket.emit('chat message', 'in namespace ' + socket.nsp.name + ' for sender'); //在当前命名空间下,向sender发出消息
news.emit('chat message', 'in namespace ' + socket.nsp.name + ' for everyone'); //在当前命名空间下,向所有客户端广播消息
});
http.listen(3000, function () {
console.log('listening on *:3000');
});
运行服务端,并浏览器中打开客户端,http://localhost:3000
在服务端控制台中看到:
肯定是 chat client对应 chat namespace, news client对应news namespace。尽管他们接收的事件都是 ‘chat client’, 绝对不会出现 news client 对应 chat namespace, 或者chat client对应news namespace。
再来刷新一个客户端,可以看到当前刷新过的客户端控制台的输出:
可以看到服务端特定发给sender以及广播的消息都有收到。并且同上,命名空间的消息仅仅对应于当前命名空间。
再看下另外一个没有刷新的客户端:
只收到了广播的消息,而不会收到发给sender的消息。 同时消息只存在于当前命名空间。