node.js - 如何在 Node 中拦截传出的tcp消息?

标签 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(transformer)时,客户端会打印“OUT:”(就像我想要的那样),但实际上并没有向服务器发送任何内容。当我交换管道位置transformer.pipe(socket)时,什么都不会打印到客户端,而是将消息发送到服务器。

尽管未在此处列出,但我也尝试使用可写流,该流确实在客户端上打印消息,但是永远不会发送到服务器(如果我在可写流中执行this.push(...),它将仍然似乎没有发送到服务器)

我在这里想念什么?

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

最佳答案

看来我需要更改以下行

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

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

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

关于node.js - 如何在 Node 中拦截传出的tcp消息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43668378/

相关文章:

node.js - 使用 npm 链接时如何修复 "Task is not in your gulpfile"错误?

node.js - 使用socket.io连接到iOS7上的Nodejs服务器

ios - 使用GCDAsyncSocket传输文件接收器

php - 在 php 中读取常量 UDP 流

java - 从 HTTP 服务器中的套接字读取的推荐方法

.net - 如何强制我的 C# 应用程序立即确认 TCP 数据报?

node.js - 文件上传到 s3 存储桶后如何触发我的 Lambda 函数

node.js - Ember 保存对属性的更改

javascript - 异步调用nodejs和python

c - libpcap:打印 TCP 源端口和目标端口