【问题标题】:Node.js tcpsocket on('data') eventNode.js tcpsocket on('data') 事件
【发布时间】:2017-09-16 08:19:00
【问题描述】:

我有一个关于 Node.js tcp 套接字和 on('data') 事件的问题。

例如,我的客户端用很长的消息socket.write('<VERY LONG MESSAGE>') 向套接字发送数据;

服务器正在侦听端口并接收该数据。

<VERY LONG MESSAGE> 是否可以通过服务器data 事件而不是从其起始字节接收? (例如由 3 个或更多部分分块)。

我知道合并消息,但是分块呢?

我应该为我的套接字实现接收到的数据大小验证和合并少数data 事件结果的结果还是socket.write 通常发送消息而不进行分块?

【问题讨论】:

  • 数据总是可以被分块的,即使发送方没有发送任何分块。但是第一个字节将在第一个块中,块应该以正确的顺序出现等。从这个意义上说,TCP 是一个有保证的协议,另一方面,UDP 需要更多的小心..
  • 这意味着data事件可以在服务器上触发几次(对于1个客户端写操作)?
  • 是的,你总是需要处理块。
  • 但是我每次有 data 事件的块中的 1 个都会有所需的起始字节?我想编写协议起始字节来识别包内的噪音,并在起始字节之后识别 4 字节的消息大小。正确的协议读取实现是否足够?
  • 不确定你的意思..但是让我们分解一下..如果说客户端发送了世界HELLO,理论上这可以分解为2个块。块 1 = HEL 块 2 = LO.. 当然,在实践中,这样的短消息可能会一次性发送。但基本上你的事件应该去 -> 数据,数据............结束。

标签: javascript node.js sockets


【解决方案1】:

是的,write 和内部接收有效负载时都可能发生分块。

套接字由操作系统内核管理。由于网络 I/O 可能需要时间,因此它们通常使用两个队列缓冲区来存放套接字;一个用于发送数据,一个用于接收数据。因此,分块消息的大小可能会因平台而异。

自己测试:

const net = require("net");
var server = net.createServer({
    allowHalfOpen: false,
    pauseOnConnect: false
}, function(serversideSocket) {
    console.log("socket connected");
    serversideSocket.on("data", function(data) {
        console.log(`got data of size ${data.length}`);
    });
    serversideSocket.on("end", function() {
        console.log("client disconnected, closing");
        server.close();
    });
}).listen(1337, "127.0.0.1", function() {
    console.log("server listening");
    var clientsideSocket = net.createConnection({
        port: 1337,
        host: "127.0.0.1",
        allowHalfOpen: false
    });
    var sendBuffer = Buffer.allocUnsafe(1048576);
    clientsideSocket.write(sendBuffer);
    clientsideSocket.end();
});

这是我的输出:

server listening
socket connected
got data of size 65536
got data of size 65536
got data of size 65536
got data of size 65536
got data of size 65536
got data of size 65536
got data of size 65536
got data of size 65536
got data of size 65536
got data of size 65536
got data of size 65536
got data of size 65536
got data of size 65536
got data of size 65536
got data of size 65536
got data of size 65536
client disconnected, closing

【讨论】:

  • 很好的答案,但可能是夹头之间的 tcp 套接字内的噪音?我应该解决那个碰撞吗?
  • 好答案..Sockets are managed by the operating system kernel.,我还想补充一点,它不仅仅是操作系统,它是你的路由器,它是你的服务提供商,它是世界另一端的服务器。
  • noise inside tcp socket 你不能在 TCP 套接字中得到噪音,这是一个有保证的协议。如果发送方发送1,2,3,4 接收端如果收到所有字节将收到1,2,3,4...
  • 确实 :),我们知道,如果每个人都必须处理这些事情,互联网将是一个巨大的痛苦。这是一个来自 wiki on TCP 的 sn-p,它确实说明了一切 -> TCP is a reliable stream delivery service which guarantees that all bytes received will be identical with bytes sent and in the correct order.
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-31
  • 2015-04-04
  • 2019-06-30
  • 2014-04-05
  • 1970-01-01
  • 2011-02-17
相关资源
最近更新 更多