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. linux下測试硬盘读写速度

    买了个ssd硬盘,就想着跟普通的机械盘做个比較.由于桌面装的是ubuntu系统,所以就想用linux的命令简单測一下好了 以下是ssd的性能数据: 測试写: xxx@WaitFish:~ > t ...

  2. No unique bean of type [net.shougongfang.action.paymoney.AlipayPayMoneyReturnObj] is defined: Unsat

    0 你把@Service放到实现类上吧.这个问题好像不止一个人在问啦 2013年10月25日 10:34 shidan66  30  0 1 1 加入评论 00 1,@service放到实现上  2. ...

  3. Gradle:Gradle入门

    一.安装Gradle  1.首先确保你安装的JDK1.5或以上版本号.  C:\Users\chengxiang.peng.QUNARSERVERS>java -version java ver ...

  4. MySQL List分区(三)

    具体介绍请看   MySQL分区一 样例:该样例为本人个人学习总结分享

  5. 2015.04.19,外语,读书笔记-《Word Power Made Easy》 11 “如何辱骂敌人” SESSION 29

    1.the French drillmaster 法国国王路易十五手下的Jean Martinet将军,是Infantry(['infәntri] n. 步兵)的检察长,是一个非常严格的drillma ...

  6. hdoj--1051--Wooden Sticks(LIS)

    Wooden Sticks Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) To ...

  7. C#对 Json的序列化和反序列化时出现“k_BackingField”

    在C#2.0的项目中,以前经常使用Json.NET实现序列化和反序列化.后来从c#3.0中开始使用新增的DataContractJsonSerializer进行json相关的操作.微软提供的原生类库使 ...

  8. Caffe_Example之训练mnist

    0.参考文献 [1]caffe官网<Training LeNet on MNIST with Caffe>; [2]薛开宇<读书笔记4学习搭建自己的网络MNIST在caffe上进行训 ...

  9. Five Invaluable Techniques to Improve Regex Performance

    Regular expressions are powerful, but with great power comes great responsibility. Because of the wa ...

  10. 请问具体到PHP的代码层面,改善高并发的措施有哪些

    1.今天被问一个问题:请问具体到PHP的代码层面,改善高并发的措施有哪些? 面对高并发问题我首先想到的是集群.缓存(apt.redis.mem.内存...),但具体到PHP代码层面除了想到队列.减少网 ...