node 内存消息队列
var net = require('net')
var clients = []
,msgs = {}
function unWrapMsg(data){
data = data.toString().trim()
var _d = data.split(':' , )
_d[] = _d[] || ''
var p1 = _d[].trim()
,p2 = _d[].trim()
,p3 = data.slice(_d[].length + _d[].length + )
return [p1 , p2 , p3]
}
function wrapMsg(p1 , p2 ,p3){
return [p1.toString() , p2.toString() , p3.toString()].join(':') + "\n"
}
exports.startServer = function(config){
var cmd = {
push : function(drawer , msg){
if (! msgs[drawer]) msgs[drawer] = []
msgs[drawer].push(msg)
},
pull : function(drawer ){
if (! msgs[drawer]) msgs[drawer] = []
return msgs[drawer].shift()
},
clean : function(drawer){
if (drawer) msgs[drawer] = []
else msgs = {}
}
}
net.createServer(function (socket) {
socket.name = socket.remoteAddress + ":" + socket.remotePort
clients.push(socket)
//socket.write("Welcome " + socket.name + "\n")
socket.on('data', function (data) {
data = unWrapMsg(data)
//console.log('from client ' ,data)
var act = data[]
,drawer = data[]
,msg = data[]
if (!cmd[act]) return
var ret = cmd[act](drawer ,msg)
//console.log(act ,msg , ret)
socket.write(wrapMsg('on' + act , JSON.stringify(ret || '') ,msg) )
//broadcast(socket.name + "> " + data, socket)
})
socket.on('end', function () {
clients.splice(clients.indexOf(socket), )
//broadcast(socket.name + " left the chat.\n")
})
function broadcast(message, sender) {
clients.forEach(function (client) {
// Don't want to send it to sender
if (client === sender) return
client.write(message)
})
process.stdout.write(message)
}
}).listen(config.port)
return cmd
}
exports.startClient = function(config){
var _cs = []
,cmd = {
'onpull' : function(ret ,cbkid){
var cbk = _cs[cbkid]
cbk && cbk(ret)
delete _cs[cbkid]
}
}
var client = net.connect(config , function() {
console.log('client connected')
//client.write('world!\r\n')
})
client.on('data', function(data) {
data = unWrapMsg(data)
//console.log('from server' , data)
var act = data[]
if (!cmd[act]) return
cmd[act](data[] , data[])
})
client.on('end', function() {
console.log('client disconnected')
})
return {
push : function(drawer , msg){
client.write(wrapMsg('push' , drawer , msg))
}
,pull : function(drawer ,cbk){
var cbkid = _cs.push(cbk) -
client.write(wrapMsg('pull' , drawer,cbkid))
}
,clean : function(drawer ){
client.write(wrapMsg('clean' , drawer ))
}
}
}
基于内存的生产/消费 MQ
server :
var nmq = require('./nmq.js')
var s = nmq.startServer({port : 5000})
var i = 0
setInterval(function(){
s.push('t' , ['server_',i++])
}, 1000)
client:
var nmq = require('./nmq.js')
var s = nmq.startClient({port : 5000})
var i = 0
setInterval(function(){
//if (+new Date % 2) s.push('t' ,'client_'+i)
s.pull('t' , function(x){
console.log('I got it' , i++ , x)
})
}, 1000)
node 内存消息队列的更多相关文章
- node使用消息队列RabbitMQ一
基础发布和订阅 消息队列RabbitMQ使用 1 安装RabbitMQ服务器 安装erlang服务 下载地址 http://www.erlang.org/downloads 安装RabbitMQ 下载 ...
- C#内存映射文件消息队列实战演练(MMF—MQ)
一.课程介绍 本次分享课程属于<C#高级编程实战技能开发宝典课程系列>中的一部分,阿笨后续会计划将实际项目中的一些比较实用的关于C#高级编程的技巧分享出来给大家进行学习,不断的收集.整理和 ...
- node事件循环和消息队列简单分析
node的好处毋庸置疑,事件驱动,异步非阻塞I/O,以及处理高并发的能力深入人心,因此大家喜欢用node做一些小型后台服务或者作为中间层和其他服务配合完成一些大型应用场景. 什么是异步? 异步和同步应 ...
- linux后台查看共享内存和消息队列的命令
ipcs ipcs -q : 显示所有的消息队列 ipcs -qt : 显示消息队列的创建时间,发送和接收最后一条消息的时间 ipcs -qp: 显示往消息队列中放消息和从消息队列中取消息的进程ID ...
- 进程间通信IPC:消息队列,信号量,共享内存
2015.3.4星期三 阴天 进程间通信:IPC 文件对象:记录文件描述符,文件开关等 IPC标示符:系统全局的流水号两个进程要通信,打开的是唯一的对象进行通讯,通过key操作 XSI IPC:消息队 ...
- 进程间通信和同步:pipe、FIFO、消息队列、信号量、共享内存、信号
一.半双工管道(pipe) 关于管道详细介绍可参考http://www.cnblogs.com/nufangrensheng/p/3560130.html. 1.管道实现父子进程间通信实例: /* p ...
- php中对共享内存,消息队列的操作
http://www.cnblogs.com/fengwei/archive/2012/09/12/2682646.html php作为脚本程序,通常生命周期都很短,如在web应用中,一次请求就是ph ...
- 《linux程序设计》--读书笔记--第十四章信号量、共享内存和消息队列
信号量:用于管理对资源的访问: 共享内存:用于在程序之间高效的共享数据: 消息队列:在程序之间传递数据的一种简单方法: 一.信号量 临界代码:需要确保只有一个进程或者一个执行线程可以进入这个临界代码并 ...
- boost进程间通信经常使用开发一篇全(消息队列,共享内存,信号)
本文概要: 敏捷开发大家想必知道并且评价甚高,缩短开发周期,提高开发质量.将大project独立为不同的小app开发,整个开发过程,程序可用可測,所以提高了总体的质量.基于这样的开发模式和开发理念,进 ...
随机推荐
- SQL注入原理以及怎样避免注入
SQL注入:究竟什么时候会用到SQL呢?回答是訪问数据库的时候.也就是说SQL注入-->直接威胁到了数据源,呵呵.数据库都收到了威胁,站点还能正常现实么? 所谓SQL注入,就是通过把SQL命令插 ...
- Chromium网页输入事件捕捉和手势检測过程分析
连续的输入事件可能会产生一定的手势操作.比如滑动手势和捏合手势. 在Chromium中,网页的输入事件是在Browser进程中捕捉的.Browser进程捕获输入事件之后,会进行手势操作检測.检測出来的 ...
- eclips 手机 offline
[退出eclipse] [进入eclipse的工作区间] [删除 .metadata文件夹,确保 .metadata文件夹得隐藏文件也要删除] [重启eclipse,并重新导入你的工程]
- weblogic管理脚本
start.sh Java代码 #!/usr/bin/bash # # start.sh # @auth: zhoulin@lianchuang.com # SERVER_STATUS () { s ...
- apache配置httpd.conf的webapp根目录(基于appserv服务)
只要修改httpd.conf中两个配置项的值即可: DocumentRoot "E:/workspacePHP/what" <Directory "E:/works ...
- Android系统自适应屏幕大小
1.屏幕相关概念1.1分辨率是指屏幕上有横竖各有多少个像素1.2屏幕尺寸指的是手机实际的物理尺寸,比如常用的2.8英寸,3.2英寸,3.5英寸,3.7英寸android将屏幕大小分为四个级别(smal ...
- Java 系列之spring学习--springmvc注解参数传递(六)
一.绑定参数注解如下 @RequestParam 绑定单个请求数据,既可以是URL中的参数,也可以是表单提交的参数或上传的文件. 它有三个属性: value 用于设置参数名. defa ...
- 关于数据未渲染完,要获取document高度问题——ajax全局事件
昨天在做开发时,遇到这样一个问题,当页面刚加载的时候,就要获取document的高度,可是此时页面上所有的ajax请求的数据都还没有渲染到页面上,所以导致得到的document的高度仅仅是页面结构的高 ...
- C语言中文件定位函数总结
C语言中文件定位函数主要是:fseek, ftell, fsetpos, fgetpos. 先来讲前两个函数,这是最基本的定位函数: fseek函数:能把文件指针移动到文件任何位置,其原型是:int ...
- java根据出生日期计算年龄
/** * @author jerry.chen * @param brithday * @return * @throws ParseException * 根据生日获取年龄; */ public ...