一个node.js编写的消息服务器,支持最新的websocket草案
2015-04-10 23:40
281 查看
简介
Json Messaging是使用node.js技术构建的发布/订阅类型的消息服务器,具有如下特性:1、支持TCP和WebSocket协议;
2、传输帧使用Json格式;
3、可以使用正则表达式订阅消息目的地,正则表达式中可以包含“捕获”,所有目的地匹配该正则表达式的消息,连同目的地的“捕获”都将发送到订阅方;
4、一个客户端可以订阅多个消息目的地;
5、为了简化设计,服务器端不持久化消息。
项目
https://sourceforge.net/projects/jsonmessaging/下载
https://sourceforge.net/projects/jsonmessaging/files/致谢
Json Messaging消息服务器使用了很多第三方的框架和技术,感谢他们辛勤的工作。Json:http://www.json.org
node.js:http://nodejs.org
node-uuid:https://github.com/broofa/node-uuid
WebSocket-Node:https://github.com/Worlize/WebSocket-Node
使用方法
1、编译安装node.js;2、打开server/config.js,可以配置TCP和WebSocket端口;
3、启动消息服务器:node server/server.js。
例子
使用最新版本的Firefox或者Chrome打开下面的HTML文件可以发送和接收消息。?
?
帧格式
消息服务器的应用层数据帧采用Json格式,使用UTF-8编码的纯文本,在TCP协议中,使用'\0'作为帧间分隔,在WebSocket协议中遵循WebSocket草案标准。帧格式有5类,其中,客户端到服务器端的3类,服务器端到客户端的2类。
客户端到服务器端
发布帧
客户端发送一条消息到服务器的目的地中,所有连接到服务器并且订阅了该目的地(正则表达式匹配)的客户端都能接收到该消息。帧格式为:
{
"type": "publish",
"destination": <消息目的地>,
"content": <消息内容>
}
其中,消息目的地为字符串类型;消息内容同样也必须是Json格式的。
订阅帧
客户端订阅服务器的一个目的地,所有匹配该目的地的消息都会发送到该客户端。帧格式为:
{
"type": "subscribe",
"destination": <消息目的地>
}
其中,消息目的地可以是正则表达式,且正则表达式中可以含有“捕获”,服务器会使用该正则表达式匹配发送的消息目的地,如果符合,则会把该消息连同匹配结果一并发给客户端,在下面的“消息帧”介绍中有具体的例子。
同一个客户端可以订阅多个目的地。
取消订阅帧
客户端取消订阅服务器的一个目的地。帧格式为:
{
"type": "subscribe",
"destination": <消息目的地>
}
其中,消息目的地等于订阅帧中的消息目的地。
当客户端断开连接后,服务器端会自动取消该客户端的所有订阅。
服务器端到客户端
消息帧
一旦消息目的地匹配,服务器端会把匹配结果连同消息内容发给客户端。帧格式为:
{
"type": "message",
"match": <匹配结果>,
"content": <消息内容>
}
匹配结果为一个数组,至少包含一个元素,即订阅的消息目的地;如果订阅的消息目的地是正则表达式且其中含有“捕获”,那么从第二往后的元素为捕获结果,参考JavaScript正则表达式规范。
举例:
假设设备的网口状态信息在消息服务中发布,规定目的地格式为:“/devices/<设备名>/<网口名>”;消息内容为:“down”表示停止、“up”表示启动。
下面两个发布帧,表示设备a的第1个网口停止了,而设备b的第个网口启动了:
{"type":"publish","destination":"/devices/a/if1","content":"down"}
{"type":"publish","destination":"/devices/b/if0","content":"up"}
如果客户端订阅目的地为“/devices/.*”,那么它将能收到所有设备的所有网口的状态消息,接收到的消息帧如下:
{"type":"message","match":["/devices/a/if1"],"content":"down"}
{"type":"message","match":["/devices/b/if0"],"content":"up"}
如果想在程序中更方便地对设备和网口做分类处理,可以把订阅目的地改为“/devices/(.*)/(.*)”,其中小括号即为“捕获”。
接收到的消息帧会变为:
{"type":"message","match":["/devices/a/if1","a","if1"],"content":"down"}
{"type":"message","match":["/devices/b/if0","b","if0"],"content":"up"}
可以看到,match中增加了捕获的结果。
错误帧
如果服务器端产生错误,例如客户端发送的帧超长、非Json格式等,将会向客户端返回错误帧。帧格式为:
{
"type": "error",
"content": <错误内容>
}
客户端可以对错误进行相应的处理。
源代码结构
server.js
程序入口。config.js
全局配置,其中的udpPort并没有使用,因为UDP难以知晓客户端状态,所以不打算实现UDP协议。log.js
控制台日志,相比其它第三方的日志模块的特点是使用简单,而且能够输出日志产生的源代码的位置,便于调试。protocol.js
协议帧的包装。exchange.js
负责处理发布和订阅的消息,是服务器代码的核心部分。tcp.js
TCP协议的实现。ws.js
WebSocket协议的实现。Mallon
发帖于 3年前
11回/3780阅
标签:
Json Messaging
Node.js
举报
| 分享到
2收藏(22)
按默认排序 显示最新评论 共有11个评论 (最后回答:
3年前)
0Mallon3年前
截图:
评论(0)| 引用此评论|
举报 (2012-01-20 14:46)
0
拉登他哥3年前
nice !
评论(0)| 引用此评论|
举报 (2012-01-20 15:09)
0
codehive3年前
这个必须顶啊,我还在自己搞呢,等下看看如何,我了个去,必须顶下
评论(0)| 引用此评论|
举报 (2012-01-20 15:14)
0
codehive3年前
怎么没有源码啊 @mallon 不是开源嘛
评论(0)| 引用此评论|
举报 (2012-01-20 15:26)
0
codehive3年前
@mallon 提供源码参考下吧,最近我也在做类似的东西,如果不错,我也参与开发,不如搞到github上吧
评论(0)| 引用此评论|
举报 (2012-01-20 15:43)
0
Mallon3年前
sourceforge上有源代码啊
--- 共有 2 条评论 ---
Mallon@codehive :
应该可以了,上传的文件需要设置适合的操作系统类型,NND真复杂。(3年前)
codehive再检查一边吧,只有提示文件大小,好像是没有可下载的,我是未登录用户 (3年前)
评论(2)| 引用此评论|
举报 (2012-01-20 16:14)
0
Mallon3年前
引用来自“codehive”的答案
@mallon 提供源码参考下吧,最近我也在做类似的东西,如果不错,我也参与开发,不如搞到github上吧github和git不会用,哈哈
评论(0)| 引用此评论|
举报 (2012-01-20 17:32)
0
Mallon3年前
花了一上午学习git github markdown,终于传上去了:
https://github.com/shajunxing/Json_Messaging
评论(0)| 引用此评论|
举报 (2012-01-21 13:00)
0
Injection3年前
引用来自“mallon”的答案
花了一上午学习git github markdown,终于传上去了:https://github.com/shajunxing/Json_Messaging
多谢,正在学习html5里面的websocket,但是好多http server不支持.这下好了.
不过能提供完整的http+websocket就好了.
评论(0)| 引用此评论|
举报 (2012-01-21 13:27)
0
Mallon3年前
引用来自“yinhao”的答案
引用来自“mallon”的答案
花了一上午学习git github markdown,终于传上去了:https://github.com/shajunxing/Json_Messaging
多谢,正在学习html5里面的websocket,但是好多http server不支持.这下好了.
不过能提供完整的http+websocket就好了.
websocket可以和web服务器分开独立架设的
相关文章推荐
- 编写一个使用 Node.js/MongoDB Web 服务的 iOS 应用
- 基于websocket,使用node.js 做一个聊天室
- 使用Node.js开发一个在线聊天应用——编写后台
- 为一个 iOS 应用编写一个简单的 Node.js/MongoDB Web 服务
- 用 node.js 的 hexo 框架搭建一个支持 markdown 的静态博客系统
- 使用Node.js开发一个在线聊天应用——编写前台
- 为一个 iOS 应用编写一个简单的 Node.js/MongoDB Web 服务
- 【备忘】2018年最新node.js+ES+Koa2手把手教你开发一个短视频网站视频教程
- 2018最新实战项目之node.js+ES+Koa2+Parcel手把手教你开发一个短视频网站
- 为一个 iOS 应用编写一个简单的 Node.js/MongoDB Web 服务
- 用node.js写一个简单的视频流服务器,支持点播
- 一个使用JAVA编写的类似按键精灵的程序,支持脚本文件编写(含源代码)
- 自己编写的一个Json工具类,实现了反射将整个Object转换为Json对象的功能,支持Hibernate的延迟加载对象
- 一个使用JAVA编写的类似按键精灵的程序,支持脚本文件编写(含源代码)
- 写一个js编写的文件上传控件。(原创的)
- C#编写一个支持Mysql,Acces,SQL数据库类(支持存储过程)
- 一个图片轮换显示的实现,使用DIV+JS,支持Firefox,IE,Safiri
- Struts 1 学习笔记-5-2(编写一个简单的支持I18N的登录系统)
- JS判断浏览器是否支持某一个CSS3属性的方法
- 一个漂亮的JS弹出日历,支持多种浏览器