JsonStream.js

JsonStream.js是一个用于node.js的双向通信协议实现,它使用json作为数据包格式,可以用于socket,也可以用于http长连接,同时自带了简单的rpc实现。这段代码现在被用于一个对实时性要求比较高的小项目,本来打算用python+twisted做,但是后来临时决定尝试一下node.js,下面举例说明用法:

第一个例子,最简单的应用,基于socket通信,发送和接受json数据
StreamServer.js

var Net = require('net');
var JsonStream = require('./JsonStream.js');

//创建一个普通的socket server
var server = Net.createServer(function(c) {
    //当有客户端连接后,socket连接之上创建一个JsonStream
    var stream = new JsonStream.Stream(c);

    //监听客户端发来的json数据
    stream.on('json', function(json) {
        console.log('receiv json from client:');
        console.log(json);
    });

    //没三秒钟向客户端发送一个json数据
    setInterval(function(){
        stream.write({
            data:'hello client',
            time:new Date()
        });
    }, 3000);
});

server.listen(7777);

第二个例子,基于socket,两端互相rpc调用
RpcServer.js

var Net = require('net');
var JsonStream = require('./JsonStream.js');

//定义服务端支持的Rpc接口
var ServerApi = {

    //这是一个普通的接口,直接返回数据
    hello:function(name) {
        console.log('client call hello');
        return 'hello ' + name;
    },

    //这是一个异步返回的方法
    //这里的SimpleDeferred的确不是一个全功能的Deffered
    //只能用在异步返回的情况
    
    helloAfter:function(name, delay) {
        console.log('client call helloAfter');
        var defer = new JsonStream.SimpleDeferred();
        setTimeout(function(){
            defer.done('hello ' + name + ' after ' + delay + 's');
        }, delay * 1000);
        return defer;
    }
};

var server = Net.createServer(function(c) {
    var stream = new JsonStream.Stream(c);
    stream.delegate = ServerApi;

    //每3秒调用一次客户端的say方法
    setInterval(function(){
        stream.rpcCall('say', ['你好!']);
    }, 3000);
});

server.listen(7777);

RpcClient.js中的调用部分

stream.rpcCall('hello', ['client a'], function(res) {
     console.log(res);
});

stream.rpcCall('helloAfter', ['client a', 1], function(res) {
     console.log(res);
});

第三个例子,用于长连接的http双向通信,由于客户端的代码和现有的业务框架结合比较紧密,暂不提供,只示意一下Server端的代码,基本使用方法和socket的类似

var Http = require('http');
var JsonStream = require('./JsonStream.js');

//Rpc接口定义
var ServerApi = {
};

//创建一个http server
var HttpServer = Http.createServer(function(request, response){
    //让JsonStream处理所有http请求
    JsonStream.HttpStream.acceptRequest(request, response);
});

JsonStream.HttpStream.events.on('new', function(stream, request) {
    console.log('new http stream !!!!!');
    stream.delegate = ServerApi;
    //发送json到浏览器端
    stream.write({
        data:'hello browser'
    });
});

HttpServer.listen(80);
//长连接的最大时长设为30秒
JsonStream.HttpStream.checkTimeOut(30);

更多细节详见源码:),经过一段时间的运行,代码已趋于稳定,可以通过svn获取代码和示例,请容忍我的不爱写注释,呵呵~:

http://code-of-emptyhua.googlecode.com/svn/trunk/nodejs/jsonstream

加入讨论

电子邮件地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据