socket.io 入门篇(三)
本文原文地址:https://www.limitcode.com/detail/5926e3a056fba70278bf2044.html
前言
上篇我们介绍了 socket.io 中room的概念和使用,本篇我们继续深入了解 socket.io 中 namespace(命名空间)的概念和使用。
对于namespace的概念只需理解3个地方:
1.在不声明新的命名空间情况下,系统会默认使用default namespace。
2.不同命名空间下的socket是不能互相通信了,是处于隔离状态的。
3.服务端使用 io.of(空间名称)声明一个命名空间。
4.客户端使用 io.connect("http://localhost:8080/namespace");连接到一个具体的命名空间。
源码下载地址:http://pan.baidu.com/s/1dFN6Fvj
项目文件结构

服务端
/**
* Created by mike on 2017/5/15.
*/ var http=require("http");
var express=require("express");//引入express
var socketIo=require("socket.io");//引入socket.io var app=new express(); var server=http.createServer(app);
var io=new socketIo(server);//将socket.io注入express模块 //namespace1 的访问地址
app.get("/namespace1",function (req,res,next) {
res.sendFile(__dirname+"/views/namespace1.html");
});
app.get("/namespace2",function (req,res,next) {
res.sendFile(__dirname+"/views/namespace2.html");
});
server.listen(8080);//express 监听 8080 端口,因为本机80端口已被暂用
console.log("服务已启动"); var namespace1=io.of("/namespace1");// 使用of("命名空间") 声明一个新的空间,不同空间下的socket是隔离的不能互相通信
var namespace2=io.of("/namespace2"); //每个客户端socket连接时都会触发 connection 事件
namespace1.on("connection",function (clientSocket) {
// socket.io 使用 emit(eventname,data) 发送消息,使用on(eventname,callback)监听消息 //监听客户端发送的 sendMsg 事件
clientSocket.on("sendMsg",function (data,fn) {
// data 为客户端发送的消息,可以是 字符串,json对象或buffer // 使用 emit 发送消息,broadcast 表示 除自己以外的所有已连接的socket客户端。
// to(房间名)表示给除自己以外的同一房间内的socket用户推送消息
clientSocket.broadcast.emit("receiveMsg",data);
fn({"code":0,"msg":"消息发生成功","namespace":"命名空间1"});
})
}); //每个客户端socket连接时都会触发 connection 事件
namespace2.on("connection",function (clientSocket) {
// socket.io 使用 emit(eventname,data) 发送消息,使用on(eventname,callback)监听消息 //监听客户端发送的 sendMsg 事件
clientSocket.on("sendMsg",function (data,fn) {
// data 为客户端发送的消息,可以是 字符串,json对象或buffer // 使用 emit 发送消息,broadcast 表示 除自己以外的所有已连接的socket客户端。
// to(房间名)表示给除自己以外的同一房间内的socket用户推送消息
clientSocket.broadcast.emit("receiveMsg",data);
fn({"code":0,"msg":"消息发生成功","namespace":"命名空间2"});
})
});
客户端
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>namespace1</title>
</head>
<body>
<label>用户:</label>
<input type="text" id="uname"/><br/> <label>聊天内容:</label><br/>
<textarea id="content" style="height: 200px; width:300px;"></textarea>
<br/>
<input id="sendMsg" type="text"/>
<button id="btn_send">发送</button> <!-- 首先引入 socket.io 客户端脚本-->
<script src="/socket.io/socket.io.js"></script>
<script type="text/javascript">
var socket = io.connect("http://localhost:8080/namespace1");//连接服务端,因为本机使用localhost 所以connect(url)中url可以不填或写 http://localhost
// 监听 receiveMsg 事件,用来接收其他客户端推送的消息
socket.on("receiveMsg",function (data) {
content.value+=data.uname+":"+ data.msg+"\r\n";
});
var content=document.getElementById("content");
var sendMsg=document.getElementById("sendMsg");
var btn_send=document.getElementById("btn_send");
var uname=document.getElementById("uname"); btn_send.addEventListener("click",function () { var data={"msg":sendMsg.value ,"uname":uname.value};
//给服务端发送 sendMsg事件名的消息
socket.emit("sendMsg",data,function (data) {
//打印消息发送成功后服务端返回的信息
console.log("消息发送:"+JSON.stringify(data));
});
content.value+=data.uname+":"+ data.msg+"\r\n";
sendMsg.value="";
}); </script> </body>
</html>
界面及交互
socket.io romm namespace 总结
记住一点:一个socket可以有多个namespace,每个namespace可以有多个room,每个namespace和room之间是隔离的不能互相通信,room可以加入但是namespace在连接时就要指定。
socket.io 入门篇(三)的更多相关文章
- socket.io 入门篇(一)
本文原文地址:https://www.limitcode.com/detail/591b114bb1d4fe074099d9c9.html 前言 本篇介绍使用node.js模块组件socket.io实 ...
- socket.io 入门篇(二)
本文原文地址:https://www.limitcode.com/detail/5922f1ccb1d4fe074099d9cd.html 前言 上篇我们介绍了 socket.io 基本使用方法,本篇 ...
- socket.io入门整理教程
socket.io入门整理 发布于 5 年前 作者 dtrex 124983 次浏览 最后一次编辑是 1 年前 我自己在用socket.io开发,对官方网站上的文档,进行简单的整理,然后自己写 ...
- 【SSRS】入门篇(三) -- 为报表定义数据集
原文:[SSRS]入门篇(三) -- 为报表定义数据集 通过前两篇文件 [SSRS]入门篇(一) -- 创建SSRS项目 和 [SSRS]入门篇(二) -- 建立数据源 后, 我们建立了一个SSRS项 ...
- Socket.io 入门 - Renyi的博客
Socket.io Vue 中使用 NPM 安装 npm install vue-socket.io --save npm install --save socket.io-client 引用 详情 ...
- 转载:socket.io 入门
原文链接:http://cnodejs.org/topic/50a1fcc7637ffa4155b5a264 我自己在用socket.io开发,对官方网站上的文档,进行简单的整理,然后自己写了一个简单 ...
- socket.io入门整理
我自己在用socket.io开发,对官方网站上的文档,进行简单的整理,然后自己写了一个简单的聊天程序. 最最开始 先安装socket.io: 1 npm install socket.io 利用Nod ...
- Node.js、Express、Socket.io 入门
前言 周末断断续续的写了第一个socket.io Demo.初次接触socket.io是从其官网看到的,看着get started做了一遍,根据官网的Demo能提供简单的服务端和客户端通讯. 这个De ...
- socket.io 入门教程
转载自:http://deadhorse.me/nodejs/2011/12/29/socket.io_induction.html socket.io socket.io是一个以实现跨浏览器.跨平台 ...
随机推荐
- 知识树杂谈Java面试(4)
一. Java集合 1. 集合分类: Collection.Map. 2. Collection: 3. Map 4. 注意点 a. List 有序.可重复:Set 无序.不可重复:Map 键值 ...
- Python练习----多级菜单
多级菜单要求: 1.三级菜单 2.可依次选择进入各子菜单 3.可以返回上一层 4.输入'q'可以退出 脚本: zone = { '北京' : { ' ...
- sharepoint 创建个人网站
One of the SharePoint 2013 puzzle pieces which got some major improvements are My Sites, User Profil ...
- CountDownLatch、CyclicBarrier和 Semaphore比较
1)CountDownLatch和CyclicBarrier都能够实现线程之间的等待,只不过它们侧重点不同: CountDownLatch一般用于某个线程A等待若干个其他线程执行完任务之后,它才执行: ...
- electron 写入注册表 实现开机自启动
windows平台 首先先明确:开机自启动写入注册表的位置,在KEY_CURRENT_USER\Software\\Microsoft\\Windows\\CurrentVersion\\Run 打开 ...
- 从零自学Hadoop(25):Impala相关操作下
阅读目录 序 导入数据 查询 系列索引 本文版权归mephisto和博客园共有,欢迎转载,但须保留此段声明,并给出原文链接,谢谢合作. 文章是哥(mephisto)写的,SourceLink 序 上一 ...
- 有序线性表(存储结构数组)--Java实现
/*有序数组:主要是为了提高查找的效率 *查找:无序数组--顺序查找,有序数组--折半查找 *其中插入比无序数组慢 * */ public class MyOrderedArray { private ...
- await和async更多的理解
最近有不少网友提起await和async,呵呵,C# 5引进的语法糖. 这个语法糖还真不好吃,能绕倒一堆初学的朋友,在网上也有很多网友关于这块知识点的争论,有对有错,今天在这里把这个误区好好讲讲. 在 ...
- Memcached理解
一.Memcached简介: 1. Memcached是一个自由开源的,高性能的,分布式内存对象缓存系统. 2. Memcached是一种基于内存的key-value存储,用来存储小块的任意数据(字符 ...
- Nginx监控-Nginx+Telegraf+Influxb+Grafana
搭建了Nginx集群后,需要继续深入研究的就是日常Nginx监控. Nginx如何监控?相信百度就可以找到:nginx-status 通过Nginx-status,实时获取到Nginx监控数据后,如何 ...