【问题标题】:How do I intercept outgoing tcp messages in node?如何拦截节点中传出的 tcp 消息?
【发布时间】:2017-09-25 20:58:56
【问题描述】:

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

例如,假设我想记录(或最终转换)用户的 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(transformer) 时,客户端会打印“OUT:”(如我所愿),但实际上并没有向服务器发送任何内容。当我交换管道位置时,transformer.pipe(socket),没有任何东西被打印到客户端,但消息被发送到服务器。

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

我在这里错过了什么?

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

【问题讨论】:

  • 请重新格式化你的代码,那一行是不可读的。所以你的意思是像 TCP 连接的代理?
  • @Mr.Phoenix ,谢谢,现在应该更好地格式化。这作为一个记录器。当有人调用 socket.write(data) 时,我想将数据打印到屏幕上。我真正的问题更复杂,但我需要弄清楚如何将处理逻辑封装在可以放入 .pipe(...) 的流中
  • 我很难理解你的 sn-p,你使用转换就像它是一个 TCP 客户端,但你只将它通过管道传回服务器,并在你将数据写入数据时期望它的输出事件它,cb 看起来不完整,它应该类似于下面的答案 cb(null,chunk) ,您可以使用 transformer.pipe(socket).pipe(client) 但对于尝试阅读此内容的人来说没有任何意义。尝试阅读 github.com/substack/stream-handbook/blob/master/readme.markdown 以更好地理解流和也许使用 dnode 包可以使这类任务不那么复杂。
  • @Mr.Phoenix 如果您将其作为答案发布,我会接受。看起来我需要在变压器而不是客户端上调用 .write() 。你的消息让我想到了那个变化。

标签: node.js sockets tcp node-streams


【解决方案1】:

看来我需要更改以下行

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

到这里

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

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

【讨论】:

    【解决方案2】:

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

    您需要this.push(chunk) 或将调用cb 更改为cb(null, chunk)

    See the docs about implementing transform streams for more info.

    【讨论】:

    • 这似乎没有什么不同。此外,在上面的示例中,我的数据很好地到达了服务器,只是没有像我预期的那样被拦截(它没有在客户端打印“OUT:”)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-04-05
    • 2022-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-18
    • 2015-09-27
    相关资源
    最近更新 更多