[英]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.