簡體   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