如何构建使用node.js通过TCP发送消息的消息?

时间:2011-07-11 12:48:12

标签: json node.js tcp

我需要从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);

2 个答案:

答案 0 :(得分:3)

要取消对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);
}

或者您可以使用节点v0.5 + buffer.writeUInt32

答案 1 :(得分: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!')
  })
})