我目前正在开发一种系统,可以从电动汽车的电池组中获取数据,将其存储在数据库中并显示在屏幕上。
所以我有一个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。
因此,第一条消息被分为两部分(ID 41,42)并正确处理。但是第二条消息被分为5个部分(ID 43-47),其中前4个没有单独发送,所以只有最后一个消息被正确保存。
我怎样才能确保每个Json都是相互发送的? 是不是有类似缓冲区的东西,以便为我发送的每条消息正确调用socket.on方法?
我希望你们中的某些人可以帮助我
谢谢!
Benedikt:)
答案 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()
,以便在每条消息中附加换行符。