[url=https://nodejs.org/api/http.html#http_event_connect_1]经典socket示例[/url] 中那样:
req.on('connect', function(res, socket, head) {
socket.on('data', function(chunk) {
console.log(chunk.toString());
});
socket.on('end', function() {
proxy.close();
});
});
[b]Readable流状态的切换
[/b]需要注意的是,Readable 流有两种状态:flowing mode(激流) 和 pause mode(暂停)。前者根本停不下来,谁被pipe上了就马上不停的给;后者会暂停,直到下游显式的调用 Stream.read() 请求才读取数据块。Readable 流初始化时是 pause mode的。
这两种状态可以互为切换的,其中,
有以下任一行为,pause 转 flowing:
1.对 Readable 流添加一个data事件订阅
2.对 Readable 调用 .resume() 显式开启flowing
3.调用 Readable 流的 .pipe(writable) ,桥接到一个 Writable 流上
有以下任一行为,flowing 转回 pause:
1.Readable 流还没有 pipe 到任何流上,可调 .pause() 暂停
2.Readable 流已经 pipe 到了流上,需 remove 掉所有 data 事件订阅,并且调用 .unpipe()方法逐一解除与下游流的关系
[b]妙用[/b]
结合流的异步特性,我可以写出这样的应用:直接将 用户A 的输出桥接到 用户B 的页面上输出:
router.post('/post', function(req, res) {
var destination = req.headers['destination']; //发给谁
cache[destionation] = req;
//是的,并不返回,所以最好是个ajax请求
});
用户B请求的时候:
router.get('/inbox', function(req, res){
var user = req.headers['user'];
cache.find(user, function(err, previousReq){ //找到之前存的req
var form = new multiparty.Form();
form.parse(previousReq); // 有文件给我
form.on('part', function (part) {
part.pipe(res); //流式大法好:)
part.on('error', function (err) {
console.log(err);
messaging.setRequestDone(uniqueID);
return res.end(err);
});
});
});
});
[b]参考[/b]
how to write node programs with streams: stream-handbook