不用框架node 怎样把页面推送到 客户端?
发布于 10 年前 作者 zhouyongshishui 4993 次浏览 最后一次编辑是 8 年前

var http = require(‘http’), fs = require(‘fs’);

http.createServer(function (req, res) { //fs貌似没有推送文件的这个方法。。。 //fs.sendFile(’./index.html’); }).listen(4000);

15 回复

var data = fs.readFileSync(‘your.html’); res.end(data);

哥们儿,你让他用同步方法,你不是存心害别人么?

@hainee 这里同步、异步都一样

@cloudcome What?怎么会一样呢?

@hainee @anti-peng @cloudcome 依我看,这里同步比异步好啊。

fs.createReadStream(‘your_static_file’).pipe(res);

@alsotang 这里同步为什么比异步好呢?Why?求赐教! 我觉得GuoZhang这样:fs.createReadStream(‘your_static_file’).pipe(res);比较好啊 难道pipe是同步的?

不一样, readFileSynce 整个文件读完后再 respone createReadStream('file').pipe(res) 这是chunk,读多少respone多少。

弄个大文件,打开浏览器就一目了然了。

NODEJS主线程是单线程的,之所以支持高并发, 就是使用了异步+回调的方式, 如果你这里使用同步处理文件,那在并发访问的时候,那其它线程可能都会阻塞在主线程。

如果在你的NODE.js主线程中业务逻辑很复杂的时候,那整个网站都会被阻塞在主线程,之所以NODEJS,单线程异步无阻塞,那是因为系统提供了异步+回调的接口,把这些处理交给了底层系统去执行才没有被阻塞, 如果在上面你使用同步可能就会导致被阻塞

个人爱好我也在自学node.js , 这是我对上面的理解,如果理解有错请多指教, 谢谢!

还是得异步 nodejs就是一个单线程任务调度器 如果同步 会造成调度器本身阻塞 这样其他请求就需要等待了吧

要客户端配合,网页上的推送也要看写网页js的人用的方法了,客户端的推送方法案就更多了,直接用socket也可以,了解原理和本质就可以想怎么做就怎么做,能做到最好。

@hainee 我的理解是:本地硬盘读写,异步没有优势,徒增了代码的复杂度。

@hainee

  1. 这里阻塞和不阻塞是一样的啊,都是在等待响应结束,并没有阻塞主线程,只是在一个异步(等待响应)里插了一个同步(读取文件)。
  2. 唯一的区别下面回复已经提到了,那就是内存方式和流的方式,不过这里返回的是html文件,可以忽略啦,不是什么大文件。
  3. 首次读取的时候,应该缓存起来,下次就直接推了。

@alsotang 那不一定啊,如果使用同步,在读取这个文件的时候,磁盘IO忙,没有及时相应,那么整个系统都会被这个读取给阻塞,导致网站服务暂停响应的!

@cloudcome 我靠,哥们,我以为我们上面说的是同一件事呢。

1 这里是会阻塞主线程的啊

2 不是大文件所以可以忽略这点我赞同

3 缓存赞同

回到顶部