gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 10:44:39 27 4
gpt4 key购买 nike

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

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

JAVA应用程序:

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

Node :

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){}
});

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

Webserver output

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

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

希望你们能帮助我

谢谢!

本尼迪克特:)

最佳答案

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

关于java - Node.js 套接字上的数据太多?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34255488/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com