socket如何同时读写?
发布于 11 年前 作者 firefox01 6140 次浏览 最后一次编辑是 8 年前

有一个server,同时实现如下功能: 1.读取客户端发送的消息写数据库。 2.读取数据一个表的数据发送个客户端。

不是等待读完再写或者写完再读,而是同时进行。

如果其他语言实现的话可能2个线程一直循环做不同的事情,

请问node.js中如何实现。

非常感谢。

3 回复

两个线程跑就是系统在切换线程执行, 实际上是一个线程在 CPU 上跑. Node 里 JS 执行是单线程的, 但通过回调会调用 JS 引擎以外的代码, 而在触发回调前执行的代码是可以同时多个线程在跑的, 也有交替执行的效果.

比如下面的代码, reqreq2 就是交替打印的:

var http, options, req, req2;

http = require("http");

options = {
  hostname: 'www.qq.com',
  port: 80,
  path: '/',
  method: 'GET'
};

req = http.request(options, function(res) {
  res.setEncoding("utf8");
  return res.on("data", function(chunk) {
    return console.log("req...");
  });
});

req2 = http.request(options, function(res) {
  res.setEncoding("utf8");
  return res.on("data", function(chunk) {
    return console.log("req2...");
  });
});

req.end();

req2.end();

谢谢 ” 两个线程跑就是系统在切换线程执行, 实际上是一个线程在 CPU 上跑. “

这个我是明白的,但是node.js不是很熟悉

我的程序结构应该是这样的:

var server = net.createServer( function(c) {

  c.on('data', function(data) {
    //do something
    //write db
  });


  //1

});

function serverStart () {
    server.listen(SERVER_PORT, function() {
        console.log('server bound');
    });    
}

serverStart();

我想在这个主流程之外同时有个循环,主动给客户端发包

while true {
 //read from db
 //write to current client
}

我是想了解,这段代码放在那个位置?

现在的实现是在//1位置放了个: setInterval(SomeFunc, 1000);

但是这个不是很符合我的需求(考虑到一次调用没完成到时间又跑一次,需要一些标记变量来判断是否执行之类的)。

请问如何实现,谢谢。

“读取数据一个表的数据”的回调函数应该是异步的,“读取客户端发送的消息写数据库”的回调函数也是异步的,所以两者之间的发生时间是没有先后顺序的。

回到顶部