2017-01-14 6 views
1

Я пытаюсь реализовать протокол сокета, и мне непонятно, как действовать. У меня есть сокет как объект Stream, и я могу записать() данные для его отправки в сокет, и я знаю, что для чтения данных могут использоваться «читаемые» или «данные». Но это плохо работает, когда протокол включает разговор, в котором один хост должен отправить часть данных, дождаться ответа и затем отправить данные снова после ответа.Какова парадигма node.js для разговора сокета?

В блоке парадигмы будет выглядеть следующим образом:

send some data 
wait for specific data reply 
massage data and send it back 
send additional data 

Насколько я могу судить, объект потока узла не имеет функцию чтения, которая будет асинхронно возвращать с числом байтов, запрошенных. В противном случае каждое ожидание может просто поместить оставшуюся функциональность в свой собственный обратный вызов.

Какова парадигма node.js для этого типа связи?

ответ

0

Технически есть Readable.read(), но его не рекомендуется (возможно, вы не можете быть уверены в размере или блокируете, не уверены.) Вы можете отслеживать состояние и каждое событие данных добавлять к Буфер, который вы продолжаете обрабатывать постепенно. Вы можете использовать readUInt32LE и т. Д. В буфере для чтения определенных частей двоичных данных, если вам нужно это сделать (или вы можете преобразовать в строку, если ее текстовые данные). https://github.com/runvnc/metastream/blob/master/index.js

Если вы хотите записать его в «блочной парадигме», вы могли бы в принципе сделать некоторые вещи обещания или асинхронной функцию, а затем

let specialReplyRes = null; 

waitForSpecialReply = f => new Promise(res => specialReplyRes = res); 

stream.on('data', (buff) => { 
    if (buff.toString().indexOf('special')>=0) specialReplyRes(buff.toString()); 
}); 

// ... 

async function proto() { 
    stream.write(data); 
    let reply = await waitForSpecialReply(); 
    const message = massage(reply); 
    stream.write(message); 
} 

Где ваше waitForSpecialReply обещание хранить и решено после определенного сообщения получен через ваш синтаксический анализ.

+0

На самом деле я еще не обмотал голову обещаниями ... в отношении государственного подхода, вот как я делаю это на стороне сервера, где все, что мне нужно сделать, это получить запрос и отправить ответ, но на стороне клиента это немного сложнее, поскольку я должен отправлять, получать, отправлять и получать, поэтому мне нужно как-то синхронизировать отправку и получение. – Michael