socket.io命名空间的详细解析

本文详细解析了socket.io的命名空间概念,通过客户端和服务端的代码示例,展示了如何在不同的命名空间中发送和接收事件。每个命名空间内的事件独立,不会交叉接收其他命名空间的事件,确保了消息的隔离性和准确性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

所谓命名空间,就是指在不同的域当中发消息只能给当前的域的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的消息。 同时消息只存在于当前命名空间。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值