[英]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个或更多。
因此,第一条消息被分为两部分(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.