Node.js套接字上的数据太多了?

时间:2015-12-13 19:44:24

标签: java json node.js performance sockets

我目前正在开发一种系统,可以从电动汽车的电池组中获取数据,将其存储在数据库中并显示在屏幕上。

所以我有一个Java - 应用程序从硬件接口读取数据,解释值并通过Socket发送到Node.js-Server。 (Java App和Webserver在同一台计算机上运行,​​因此Url = localhost)

JAVA APP:

s = new Socket();
s.connect(new InetSocketAddress(URL, PORT));
out = new PrintWriter( s.getOutputStream(), true);
for (DataEntry e : entries){
        out.printf(e.toJson());
}

节点

sock.on('data', function(data) {
    try{
        var data = JSON.parse(data);
        db.serialize(function(){
            db.run("INSERT INTO DataEntry(value, MessageField, time) values(" + data.value + "," + data.messageFieldID + ", STRFTIME('%Y-%m-%d %H:%M:%f'))");
        });
    } catch(e){}
});

我从硬件接口每秒获得大约20条消息,这些消息被转换为100个Json - 字符串。因此,网络服务器必须在10毫秒内处理一条消息,我认为这是可管理的。 但问题是:如果我的条目 - 列表(foreach循环)有超过2个元素,则网络服务器在一条消息中获得2个或更多Json。

Webserver output

因此,第一条消息被分为两部分(ID 41,42)并正确处理。但是第二条消息被分为5个部分(ID 43-47),其中前4个没有单独发送,所以只有最后一个消息被正确保存。

我怎样才能确保每个Json都是相互发送的? 是不是有类似缓冲区的东西,以便为我发送的每条消息正确调用socket.on方法?

我希望你们中的某些人可以帮助我

谢谢!

Benedikt:)

1 个答案:

答案 0 :(得分:1)

TCP套接字只是流,您不应该对单个数据包中包含多少“消息”做出任何假设。

对此的一个简单解决方案是使用换行符终止每条消息,因为JSON不能包含这样的字符。从那里开始,只需要一个简单的缓冲数据,直到你看到换行符。 然后在缓冲区上调用JSON.parse()。例如:

var buf = '';
sock.on('data', function(data) {
  buf += data;
  var p;
  // Use a while loop as it may be possible to have multiple
  // messages buffered depending on chunk contents
  while (~(p = buf.indexOf('\n'))) {
    try {
      var msg = JSON.parse(buf.slice(0, p));
    } catch (ex) {
      console.log('Bad JSON message: ' + ex);
    }
    buf = buf.slice(p + 1);
  }
});

您还需要在Java端将printf()更改为println(),以便在每条消息中附加换行符。