【问题标题】:How do I frame messages for sending over TCP with node.js?如何使用 node.js 通过 TCP 发送消息?
【发布时间】:2011-10-02 18:42:43
【问题描述】:

我需要从 node.js TCP 服务器向多个 TCP 客户端发送 JSON 字符串。

为了从客户端的套接字/流中读取消息,我需要进行某种消息框架。一种方法是在消息前面加上消息长度作为数组的前缀 - 然后将其转换为客户端消息的缓冲区大小。

我将如何在服务器上的 node.js/javascript 中执行类似的操作,然后使用 .NET 客户端在客户端读取它?

鉴于此客户端代码,我将如何使用 javascript/node 在服务器端正确构建消息?

TcpClient client = new TcpClient(server, port);
var netStream = client.GetStream();

// read the length of the message from the first 4 bytes
byte[] b = new byte[4];
netStream.Read(b, 0, b.Length);
int messageLength = BitConverter.ToInt32(b, 0);

// knowing the length, read the rest of the message
byte[] buffer = new byte[messageLength];
netStream.Read(buffer, b.Length, buffer.Length);
var message = System.Text.Encoding.UTF8.GetString(buffer);

【问题讨论】:

    标签: json node.js tcp


    【解决方案1】:

    要在 nodejs 中解帧传入数据,您可以尝试使用 node-bufferlistnode-buffers 或手动创建您自己的FSM 并将传入的数据块提供给它

    服务器端更简单:

    function sendPacket(stream, buffer)
    {
        var prefix = new Buffer(4);
        var length = buffer.length;
        var offset = 0;
        // serialize 32bit little endian unsigned int
        prefix[offset++] = length & 0xff;
        prefix[offset++] = (length >> 8)  & 0xff );
        prefix[offset++] = (length >> 16)  & 0xff );
        prefix[offset++] = (length >> 24)  & 0xff );
        stream.write(prefix);
        stream.write(buffer);
    }
    

    或者你可以使用 node v0.5+ buffer.writeUInt32

    【讨论】:

    • Buffer 类是我所需要的。我想我应该先有 RTFM。谢谢@Andrey。
    • 请注意,0.5 被认为是不稳定的,并且 0.4.9 缓冲区中没有 int/float 序列化程序
    【解决方案2】:

    你可以使用frame-stream:

    var net = require('net')
    var frame = require('frame-stream')
    var port = 30000
    
    net.createServer(function(socket) {
      socket.pipe(frame.decode()).on('data', function(buf) {
        console.log(buf.toString())
      })
    }).listen(port, function() {
      net.connect(port, function() {
        var encode = frame.encode()
        encode.pipe(this)
        encode.write('hello world')
        encode.end('cheerio!')
      })
    })
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-05-12
      • 1970-01-01
      • 1970-01-01
      • 2016-08-21
      • 2019-03-31
      • 2011-09-24
      • 2016-07-16
      • 2013-03-14
      相关资源
      最近更新 更多