2013-12-19 35 views
1

想知道是否有什麼特別的我需要做的來寫入數據包的數組,依次到Node.js.中的net.Socket的實例。如何將一個數據包序列寫入Node.js net.Socket?

我不確定在for循環中寫入同一個套接字是同步還是異步。

如果它是異步的,我需要promisify Socket.write並有循環設置一個.then()鏈。我已經在使用bluebird作爲承諾。

謝謝!

+0

如果通過「異步」,你的意思是「它是否阻止I/O」,那麼是的,'for'循環會阻止執行。查看像https://github.com/caolan/async這樣的異步庫來處理數組。 – srquinn

+1

這個問題並不是天氣'for'循環塊(他們沒有)。是否'Socket.write()'阻止後續寫入同一套接字。我會假設它有一個這樣做的方法,因爲你不能同時寫入一個套接字多個數據包。 – leeoniya

+0

'for'循環絕對是DO塊。腳本的執行不會繼續,直到for循環結束並因此綁定線程。 – srquinn

回答

0

我也被這個困惑了。大多數的Node.js例子使它看起來像write()是同步的:

var server = net.createServer(function(socket) { 
    socket.write('Hello!'); 
    socket.end(); 
}); 

原來的write()實際上意味着write_eventually()非回調版本。如果它不能真正將數據寫入套接字,它會將其排入內存。節點負責最終將排隊數據寫入套接字。

我想他們這樣做是因爲回調很煩人,這減少了代碼中的回調次數。缺點是它使用更多內存(請參閱:Socket.bufferSize)。

如果你推大量的數據,它的內存更有效地使用的write()回調版本:

"use strict"; 

var net = require("net") 

function writeArray(arrayOfChunks, socket, callback) { 
    var i = 0; 
    function f() { 
    if (i >= arrayOfChunks.length) { 
     callback(); 
    } else { 
     socket.write(arrayOfChunks[i++], null, f); 
    } 
    } 
    f() 
} 

var server = net.createServer((socket) => { 
    var arrayOfChunks = ['Hello', ', ', 'world!', '\n']; 
    writeArray(arrayOfChunks, socket,() => { 
    socket.write('DONE\n', null,() => { 
     socket.end(); 
    }) 
    }) 
}) 

server.listen(9191,() => { 
    console.log("Server listening."); 
}) 

但它是2016年,所以也許你可以只使用async/await,而不必處理回調/承諾廢話。

0

確保按順序執行多次寫入。

請求:響應不保證映射1:1。