如何拦截节点中的传出tcp消息?

时间:2017-04-27 21:40:08

标签: node.js sockets tcp node-streams

如何编写拦截消息的简单流?

例如,假设我想通过用户的socket.write(...)调用来记录(或最终转换)通过线路发送的消息。

以下是尝试执行此操作的最小程序:

const net    = require('net');
const stream = require('stream');

const socket = new net.Socket();

const transformer = new stream.Transform({
  transform(chunk,e,cb){
    console.log("OUT:"+chunk.toString());
    cb();
  }});
//const client = socket.pipe(transformer); // <= prints "OUT:" on client, but nothing on server
const client = transformer.pipe(socket); // <= prints nothing on client, but "hello world" on server

socket.on('data', (data)=>{ console.log("IN:"+data.toString()); });
socket.connect(1234, 'localhost', ()=>{ client.write("hello world"); });

当我执行socket.pipe(变换器)时,客户端打印&#34; OUT:&#34; (就像我想要的那样),但实际上并没有向服务器发送任何内容。当我交换管道位置,transformer.pipe(套接字)时,没有任何内容被打印到客户端,但消息被发送到服务器。

虽然这里没有列出,但我也尝试使用Writable流,它在客户端上打印消息,但它永远不会发送到服务器(如果我在Writable中执行this.push(...)流,它似乎仍然没有发送到服务器)

我在这里缺少什么?

编辑:为了清晰起见重新格式化代码并更新了文本

2 个答案:

答案 0 :(得分:0)

您没有从流中写出任何数据。

您需要this.push(chunk)或将cb的来电更改为cb(null, chunk)

See the docs about implementing transform streams for more info.

答案 1 :(得分:0)

看起来我需要更改以下行

socket.connect(1234, 'localhost', ()=>{ client.write("hello world"); });

到这个

socket.connect(1234, 'localhost', ()=>{ transformer.write("hello world"); });

这是基于@Phoenix先生的评论。我希望.pipe()返回一个我可以使用的新流。我相信Java的netty框架就是这样做的,我一直希望节点流的工作方式相同。