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 内存消息队列的更多相关文章

  1. node使用消息队列RabbitMQ一

    基础发布和订阅 消息队列RabbitMQ使用 1 安装RabbitMQ服务器 安装erlang服务 下载地址 http://www.erlang.org/downloads 安装RabbitMQ 下载 ...

  2. C#内存映射文件消息队列实战演练(MMF—MQ)

    一.课程介绍 本次分享课程属于<C#高级编程实战技能开发宝典课程系列>中的一部分,阿笨后续会计划将实际项目中的一些比较实用的关于C#高级编程的技巧分享出来给大家进行学习,不断的收集.整理和 ...

  3. node事件循环和消息队列简单分析

    node的好处毋庸置疑,事件驱动,异步非阻塞I/O,以及处理高并发的能力深入人心,因此大家喜欢用node做一些小型后台服务或者作为中间层和其他服务配合完成一些大型应用场景. 什么是异步? 异步和同步应 ...

  4. linux后台查看共享内存和消息队列的命令

    ipcs ipcs -q : 显示所有的消息队列 ipcs -qt : 显示消息队列的创建时间,发送和接收最后一条消息的时间 ipcs -qp: 显示往消息队列中放消息和从消息队列中取消息的进程ID ...

  5. 进程间通信IPC:消息队列,信号量,共享内存

    2015.3.4星期三 阴天 进程间通信:IPC 文件对象:记录文件描述符,文件开关等 IPC标示符:系统全局的流水号两个进程要通信,打开的是唯一的对象进行通讯,通过key操作 XSI IPC:消息队 ...

  6. 进程间通信和同步:pipe、FIFO、消息队列、信号量、共享内存、信号

    一.半双工管道(pipe) 关于管道详细介绍可参考http://www.cnblogs.com/nufangrensheng/p/3560130.html. 1.管道实现父子进程间通信实例: /* p ...

  7. php中对共享内存,消息队列的操作

    http://www.cnblogs.com/fengwei/archive/2012/09/12/2682646.html php作为脚本程序,通常生命周期都很短,如在web应用中,一次请求就是ph ...

  8. 《linux程序设计》--读书笔记--第十四章信号量、共享内存和消息队列

    信号量:用于管理对资源的访问: 共享内存:用于在程序之间高效的共享数据: 消息队列:在程序之间传递数据的一种简单方法: 一.信号量 临界代码:需要确保只有一个进程或者一个执行线程可以进入这个临界代码并 ...

  9. boost进程间通信经常使用开发一篇全(消息队列,共享内存,信号)

    本文概要: 敏捷开发大家想必知道并且评价甚高,缩短开发周期,提高开发质量.将大project独立为不同的小app开发,整个开发过程,程序可用可測,所以提高了总体的质量.基于这样的开发模式和开发理念,进 ...

随机推荐

  1. oracle实现查询每个部门的员工工资排在前三的员工的基本信息具体举例

    --先删除原先存在的表: drop table emp; --创建表emp create table emp ( deptno number, ename varchar2(20), sal numb ...

  2. 兔子-RadioButton和RadioGroup的关系

    RadioButton和RadioGroup的关系: 1.RadioButton表示单个圆形单选框.而RadioGroup是能够容纳多个RadioButton的容器 2.每一个RadioGroup中的 ...

  3. Oracle 11G R2 RAC中的scan ip 的用途和基本原理

    Oracle 11G R2 RAC增加了scan ip功能,在11.2之前,client链接数据库的时候要用vip,假如你的cluster有4个节点,那么客户端的tnsnames.ora中就对应有四个 ...

  4. python中黏包现象

    #黏包:发送端发送数据,接收端不知道应如何去接收造成的一种数据混乱现象. #关于分包和黏包: #黏包:发送端发送两个字符串"hello"和"word",接收方却 ...

  5. ListView的Item动画

    1.效果图 2.需求就是点击item歌曲时,实现一种飞入到预约按钮处的效果 3.思路:在布局文件中加入了一个条目布局,和listView的item一样,点击listView的item时,使用给条目布局 ...

  6. Android ImageView 替换图片

    网上找了半天,找到的都是错的,都不是我想要的效果.我想要的是点击一个图片后,图片被替换. 通过一下方法可以实现:“v”是ImageView对象,“image_name”是替换后的图片资源 ((Imag ...

  7. Codeforces div2 #499 B. Planning The Expedition 大水题

    已经是水到一定程度了QAQ- Code: #include<cstdio> #include<algorithm> #include<cstring> using ...

  8. java 公开内部类无法实例化 no enclosing instance 解决办法

    因为B类不是A类的静态内部类,所以B累也只能像A类的成员一样通过new A()的实例访问,new(new A()).B(),这显然不是我们想要的方式,于是需要在B类的前边加上static,变成下边这样 ...

  9. 基础——(5)D Flip-Flop(D触发器)

    之前搞了一个 D-Latch,看一下下图是怎么变化的 In D-latch anytime its enabled the input D is going to be output at Q 使用c ...

  10. CF1027F Session in BSU (并查集+树上构造)

    题目大意:你可以在第$ai$天或者第$bi$天进行第$i$场考试,每天最多进行一场考试,求把所有考试都考完的最早结束时间 由于天数可能很大,需要离散 把问题抽象成一棵树,每个点最多被"分配& ...