想知道是否有什麼特別的我需要做的來寫入數據包的數組,依次到Node.js.中的net.Socket
的實例。如何將一個數據包序列寫入Node.js net.Socket?
我不確定在for
循環中寫入同一個套接字是同步還是異步。
如果它是異步的,我需要promisify Socket.write
並有循環設置一個.then()
鏈。我已經在使用bluebird
作爲承諾。
謝謝!
想知道是否有什麼特別的我需要做的來寫入數據包的數組,依次到Node.js.中的net.Socket
的實例。如何將一個數據包序列寫入Node.js net.Socket?
我不確定在for
循環中寫入同一個套接字是同步還是異步。
如果它是異步的,我需要promisify Socket.write
並有循環設置一個.then()
鏈。我已經在使用bluebird
作爲承諾。
謝謝!
我也被這個困惑了。大多數的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
,而不必處理回調/承諾廢話。
確保按順序執行多次寫入。
請求:響應不保證映射1:1。
如果通過「異步」,你的意思是「它是否阻止I/O」,那麼是的,'for'循環會阻止執行。查看像https://github.com/caolan/async這樣的異步庫來處理數組。 – srquinn
這個問題並不是天氣'for'循環塊(他們沒有)。是否'Socket.write()'阻止後續寫入同一套接字。我會假設它有一個這樣做的方法,因爲你不能同時寫入一個套接字多個數據包。 – leeoniya
'for'循環絕對是DO塊。腳本的執行不會繼續,直到for循環結束並因此綁定線程。 – srquinn