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. js写发布微博文本框---2017-04-14

    实现效果: 1.文本框输入内容,低端字数对应减少 2.当文本框内容超出时,会显示字数超出多少 效果图如下: 实现代码: <!DOCTYPE html><html> <he ...

  2. Winform WPF 窗体显示位置

    WinForm 窗体显示位置 窗体显示的位置首先由窗体的StartPosition决定,FormStartPosition这个枚举值由如下几种情况 // 摘要: // 窗体的位置由 System.Wi ...

  3. Memcache使用场景

    session //php文件中 ini_set("session.save_handler", "memcache"); ini_set("sess ...

  4. jQuery应用实例3:鼠标经过显示离开隐藏

    效果: 代码: <!DOCTYPE html> <html lang="en"> <head> <meta charset="U ...

  5. 一.Windows I/O模型之选择(select)模型

    1.选择(select)模型:选择模型:通过一个fd_set集合管理套接字,在满足套接字需求后,通知套接字.让套接字进行工作.避免套接字进入阻塞模式,进行无谓的等待.选择模型的核心的FD_SET集合和 ...

  6. [转]opencv学习资料

    转自:http://blog.csdn.net/poem_qianmo/article/details/20537737 1:Mat imread(const string& filename ...

  7. 像素点的Hessian矩阵

    最近开始学习图像处理相关知识,碰到对像素点求黑塞矩阵查了资料才搞懂. 给定一个图像f(x,y)上的一点(x,y).其黑塞矩阵如下: 因为导数的公式是f'(x)=(f(x+dx)-f(x))/dx在数字 ...

  8. RabbitMQ学习笔记(2)----RabbitMQ简单队列(Hello World)的使用

    1. 简单队列结构图 2. 引入依赖 pom.xml文件 <dependency> <groupId>com.rabbitmq</groupId> <arti ...

  9. Java并发--安全发布对象

    单例模式 懒汉模式:多线程非线程安全,在多线程中,可能会产生多个对象 饿汉模式:线程安全. 类加载的时候初始化,不推荐在构造函数需要做耗时操作的时候使用,因为可能导致类加载缓慢,而且可能初始化后并没有 ...

  10. Kattis -I Can Guess the Data Structure!

    I Can Guess the Data Structure! There is a bag-like data structure, supporting two operations: 1 x1  ...