2016-01-28 14 views
0

我正在尝试从node.js(服务器)连续发送字节到Android(客户端)。让我展示代码示例。在node.js中分别发送套接字数据

var net = require('net'); 
var server = net.createServer(function(c){ 
    c.on('data', function(data){ 
     if(data == 'foo'){ 
      for(var i = 1; i <= 255; i++){ 
       var byteData = makeBytedata(); 
       c.write(byteData); 
       wait(100) 
      } 
     } 
    }); 
}); 

此代码无法正常工作,因为它有时会将byteData组合到一个数据包中。有没有人有解决方案分别发送字节?

+0

这是一个很难理解你在问什么,但您可能需要阅读本关掉它可以合并单独写进Nagle算法延迟常见的数据包:https://nodejs.org/api/net.html#net_socket_setnodelay_nodelay。此外,nodejs服务器中的“wait(100)”可能是错误的设计,因为nodejs是单线程的,在硬连线的等待循环期间它不能做任何事情。 – jfriend00

+0

谢谢。我在for循环之前插入c.setNoDelay(true),但组合了字节。 – yosh

+1

“字节组合”是什么意思?在TCP中,当连接另一端的客户端从套接字读取数据时,它可能会读取所有可用的字节。这就是TCP的工作原理。这不是数据报协议。 – jfriend00

回答

0

net.createServer创建TCP服务器,TCP不单独发送消息。 TCP是一个协议,这意味着当您向套接字写入字节时,您会在接收端以相同的顺序获得相同的字节。

解决方法之一:为您的消息定义一种格式,以便您的客户端可以确定套接字流中消息的开始和结束。例如,您可以使用\n来标记消息的结尾。

for(var i = 1; i <= 255; i++){ 
     var byteData = makeBytedata(); 
     c.write(byteData + '\n'); 
    } 

然后客户可以通过\n将它们分开。

另一种方法可以是使用UDP/Dgram

var dgram = require("dgram"), 
    server = dgram.createSocket('udp4'); 

server.on("message", function(msg, rinfo) { 
    // send message to client 
});