Nodejs流式传输

14

我想使用Nodejs实现一个简单的客户端-服务器连接。

但是我遇到了以下问题。

考虑以下代码:

server.js:

var net = require('net'),
    sys = require('sys');

    net.createServer(onConnection).listen(8124);

    function onConnection(socket) {
     socket.setNoDelay(true);

     socket.addListener("connect", function () {
      sys.puts('client connected: ' + this.remoteAddress);
     });

     socket.addListener("data", function (data) {
      sys.puts("message: \n" + data + "\n - end of msg.");
     });

     socket.addListener("end", function () {
      sys.puts('end of connection');
      this.end();
     });
    }

    sys.puts('Server running at 127.0.0.1:8124');

client.js:

var net = require('net'),
 sys = require('sys');

var stream = net.createConnection(8124);
stream.addListener("connect", function(){
 sys.puts('connected');

 stream.write('a');
    stream.flush();
 stream.write('b');
    stream.flush();

});

stream.addListener("data", function(data){
 sys.puts("Message: \n" + data + "\n - end of msg.");
});

当我运行client.js时,有时只会收到一条消息“ab”,而不是两条消息“a”和“b”。

有没有什么“正确的方法”来处理这种情况?


1
你甚至可能会收到“吧”!!不能保证按照发送顺序接收数据。 - Morteza Milani
7
TCP/IP能够确保数据按发送顺序接收,因此在这种情况下,它始终是ab。请注意,这是一句完整的英语句子,其中涉及了一个专业术语“TCP/IP”,翻译时需要根据上下文和背景进行适当的解释。 - Kornel
3个回答

13

TCP是一种流协议。在管道的一端进行单个write操作可能会导致在另一端进行多个“读”操作,反之亦然。您必须要么在消息中明确告知对方发送的字节数量,包括长度;要么提供易于识别的消息分隔符。无论哪种情况,您都需要在循环中读取。


那么,唯一的“正确方法”就是将传入的数据连接起来并作为一个整体进行解析吗?我想到了这个方法,只是想确保没有其他方法 :) - Dan
2
你必须将其视为一个流。按照字节的顺序解析它们,在找到完整的消息时做出反应。 - Nikolai Fetissov

0
使用socket.write返回值和回调,如此文档https://nodejs.org/api/net.html#net_socket_write_data_encoding_callback所述,以知道何时将数据完全刷新到内核。等待它发生后再调用第二个写入。这样可以确保顺序。关于“a”和“b”的逻辑分离问题,您可能希望设计/实现自己的“协议”,这不是(低级)套接字API的责任。

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接