【问题标题】:node.js: Sending and receiving bytes to a TCP socketnode.js:向 TCP 套接字发送和接收字节
【发布时间】:2020-04-13 01:45:23
【问题描述】:

这应该很容易弄清楚,但我感到非常沮丧,而且我似乎无法为这个相当简单的案例找到文档。

我想通过 TCP 连接发送字节(而不是字符串)并处理响应。这就是我所拥有的,但它会在使用 Buffer 类型时引发类型异常。当我改用字符串类型时,它发送字节 0xc3 0xbe 0x74 0x01 而不是 0xfe 0x74 0x01(来自 tcpdump)。天知道为什么。

如果我应该改用管道接口,那就太好了,但我似乎找不到如何为 TCP 流而不是文件这样做。

const net = require ('net')

const pumpIP = '192.168.1.208'
const pumpPort = 2101
const pumpStr = '\xfe\x74\x01'
const pumpBuffer = Buffer.from(0xfe, 0x74, 0x01)


var pump = new net.Socket()

pump.connect(pumpPort, pumpIP, function() {
    pump.write(pumpBuffer)    // <-- this throws a type error
//  pump.write(pumpStr)       // <-- this sends 0xc3 0xbe 0x74 0x01 instead
})

pump.on('data', function(data) {
//  code to handle data
    pump.destroy()
})

【问题讨论】:

    标签: node.js sockets tcp buffer


    【解决方案1】:

    对于您的Buffer.from(),您需要使用一个数组。试试这个:

    const pumpBuffer = Buffer.from([0xFE, 0x74, 0x01]);
    

    https://nodejs.org/api/buffer.html#buffer_class_method_buffer_from_array

    【讨论】:

    • 非常感谢。我是 node.js 的新手。那行得通。
    • 我不明白为什么Buffer.from(0xFE, 0x74, 0x01) 甚至被接受?它似乎与任何记录在案的调用签名都不匹配。
    • 我很确定我从某处的代码 sn-p 中获得了该模式,所以可能已弃用?我现在正试图弄清楚我从“数据”事件中得到了什么对象。我已经弄清楚它是一个对象,但是什么样的对象? node.js 文档说“由 Node.js API 创建的所有流都只在字符串和 Buffer(或 Uint8Array)对象上运行。但是,流实现可以使用其他类型的 JavaScript 值......这样的流被认为在“对象模式”下运行。”但它没有说什么类型的对象......
    • 有几种方法可以使用三个参数调用Buffer.from(),所以我猜它会被强制转换为其中一种。至于你在data 事件中得到的结果,除非你指定了编码,否则它绝对是一个缓冲区。 (而且,在此代码示例中,您没有。)另外,我建议改用 readable 事件。 nodejs.org/api/stream.html#stream_event_readable 以后更容易集成到流 API 中。
    • 是的,看来我确实找回了一个缓冲区,谢谢。我将研究可读事件。对于极端情况可能会更好。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-11
    • 2010-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多