2013-12-19 1 views
1

Хотелось бы узнать, есть ли что-то особенное, что мне нужно сделать, чтобы написать массив пакетов, последовательно к экземпляру net.Socket в Node.js.Как написать последовательность пакетов в Node.js net.Socket?

Я не уверен, что запись в один и тот же сокет в цикле for будет синхронной или асинхронной.

Если это асинхронный, мне нужно было бы промизировать Socket.write и установить петлю цепь .then(). Я уже использую bluebird для обещаний.

спасибо!

+0

Если «async» означает «он блокирует ввод-вывод», тогда да, блок «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.