2012-12-30 168 views
3

我想利用Node.js中的TCP套接字與Lua程序進行通信。我試圖讓我的頭腦有兩個問題。首先緩衝區。根據我的理解,當數據從套接字提供給你的代碼時,它將是迄今爲止接收到的任何數據(一個數據流而不是數據包)。所以當你讀取收到的數據時,可能會從發送的數據中分解出來。緩衝區,插座。 node.js

即數據接收 {學校: 「龍

VS數據發送 {學校:[{」 長木」, 「Hillbrow」}]}

來解決這個問題的辦法是把。您的數據到一個「緩衝」和你使用任何方法證明資料片的最終分裂它通常看起來是新的生產線

我的問題在這裏:

  1. 您最終可以在緩衝區中獲得更多的2個或更多完整的數據段,您將如何處理? For循環?
  2. 數據離開套接字時出現同樣的問題。不過,在其他代碼示例中,我注意到人們在寫入套接字之前使用Node.js Buffer。爲什麼這不用於傳入數據?
  3. 如果寫入的數據超過可處理的數量,Node是否爲您處理此問題,或者是否需要提供方法?

最後我好像誤解了數據端。發送和接收的所有數據是否需要轉換爲二進制文件並返回?我只希望來回發送JSON數據。我認爲那裏存在我的困惑。例如:

var myQuestion = "Is this acceptable and will I encounter any issues? 
socket.write(myQuestion); 

非常感謝您的時間。

+0

PS:我想從長遠的問題道歉。花2天通過各種論壇,羣組和其他職位曳,仍然沒有一個瞭解之後,我想也許有人可能的方式,我會得到解釋! :) –

回答

5
  1. 是的,你絕對可以用幾個數據段結束。它完全取決於你在任何一端編寫的代碼。
  2. 我不完全按照「在寫入之前使用緩衝區」所表達的意思。緩衝區只是純粹的二進制數據,它們用於傳入和傳出數據。節點通常也接受用於發送的字符串,並假定在沒有給出編碼的情況下它們是UTF8。如果您致電setEncoding,您也可以收到字符串。
  3. 的OS具有用於TCP套接字上輸入數據緩衝器,並且當所述緩衝器是滿的(由節點排空太慢),它將停止接受數據包,直到有空間。

首先,Buffer是二元的。緩衝區只是一個字節數組,僅此而已。緩衝區可以從字符串創建,節點會在某些情況下自動完成。在你的情況下,我會建議你致電socket.setEncoding('utf8')。這會自動將傳入數據轉換爲字符串以簡化解析。

至於處理和分割數據,它是由你。 TCP只提供按照發送順序到達的字節流。正如你所說的,你可以收集字節,當收到一個換行符時,你將所有內容都解析爲JSON。這應該很好。您可以使用任何不會在JSON內彈出的字符。只要執行JSON序列化的程序不添加換行符,就會設置。作爲「數據」被髮射時,可以檢查字符串換行,如果沒有,然後將其添加到任何先前接收的數據,如果你找到它,然後把它分解了,加上現有的數據。

+0

非常感謝您的回覆。我已經重寫了問題二,希望它更清楚一點。我還添加了一個socket.write示例。我需要在發送之前將字符串轉換爲二進制,還是Node要處理所有這些? –

+0

@ChrisEvans更新'2.' – loganfsmyth

+0

輝煌!至於緩衝區,你可以看到我的意思的例子:https://github.com/Overtorment/NoobHub/blob/master/server/node.js我不確定如果字符串的附加好處無論如何都被Node接受。 –

1

緩衝區用於發送和接收信息。正如您已經注意到的那樣,收到的數據可能是分散的。始終由代碼將這些數據恢復成正確的部分。

完全有可能在緩衝區中接收兩個數據塊。通常情況下,你會得到某種分隔符(比如像你提到的一個新行)。我做的是這樣的:

  1. 當數據到來時,它串聯到一個接收到的數據緩衝區的末尾。
  2. 有一個從此緩衝區讀取的功能,在您的邏輯數據包分隔符上進行拆分
  3. 驗證該邏輯數據包。
  4. 如果該數據包是有效且完整的,則將事件提交到代碼的更高級別部分,以獲取完整的信息。將您的JSON全部解析爲常規對象來引發此事件。