繁体   English   中英

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

[英]Too much data on Node.js socket?

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

因此,我有一个Java应用程序,该程序从硬件接口读取数据,解释值并通过套接字将其发送到Node.js服务器。 (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循环)具有两个以上的元素,则Web服务器会在一条消息中获得Json的2个或更多。

Web服务器输出

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

我如何确保每个Json都互相发送? 是否没有类似缓冲区的内容,以便对我发送的每条消息都正确调用socket.on方法?

我希望你们中有人可以帮助我

谢谢!

Benedikt :)

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() ,以便将换行符附加到每条消息中。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM