Sockets Nodejs流媒体

Sockets Nodejs流媒体,sockets,streaming,node.js,Sockets,Streaming,Node.js,我想使用Nodejs实现一个简单的客户机-服务器连接。 但我遇到了以下问题 以代码为例 server.js: var net = require('net'), sys = require('sys'); net.createServer(onConnection).listen(8124); function onConnection(socket) { socket.setNoDelay(true); socket.addListener("

我想使用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”


有什么“正确的方法”来处理这个问题吗?

TCP是一种流协议。管道一端的单个
write
会导致另一端的多个“读取”,反之亦然。您必须通过在消息中包含长度来明确地告诉对方您正在发送多少字节;或者提供易于识别的消息分隔符。在任何情况下,您都需要在循环中读取数据。

使用此处所述的socket.write返回值和回调,以了解数据何时完全刷新到内核。等待这种情况发生,然后调用第二次写入。这样你就可以确保订购了。关于“a”和“b”的逻辑分离问题,您可能希望自己设计/实现该协议,这不是(低级别)的责任socket API。

所以,唯一“正确的方法”是连接传入数据并将其作为一个整体进行解析?我想到了这一点,只是想确保没有其他方法:)您必须将其视为一个流。在出现字节时对其进行解析,在找到完整的消息时做出反应。您甚至可能会收到“ba”!!系统中没有可接收数据的授权人您发送数据的顺序。@MortezaM。实际上,TCP/IP保证数据将按发送顺序接收,因此在这种情况下,数据将始终是
ab