Я реализую протокол tcp в узле.
Полный источник:
https://github.com/roelandmoors/ads.js/blob/master/ads.js
спецификации:
http://infosys.beckhoff.com/content/1033/tcadsamsspec/html/tcadsamsspec_amstcppackage.htm?id=17754
Проблема в том, что я использую это для отправки пакета:
this.tcpClient.write(buf);
Если я отправляю несколько команд, то несколько команд объединяются в один пакет tcp.
Это не работает.
На SO есть больше вопросов об этом, но они рекомендуют использовать делиметр.
Но поскольку я не могу изменить протокол, это не вариант.
Разве нет простого решения для размытия сокета?
socket.setNoDelay () не помогает.
Изменить: я также попытался использовать событие стока, чтобы отправить следующую запись, но событие никогда не вызывается?
Обновить:
Это, похоже, решает проблему, но очень опасно, и я не сейчас, если он всегда работает.
Вместо того, чтобы писать его напрямую, я пишу в буфер:
this.writeFILO.push(buf);
Каждый цикл (?) Я пишу пакет в stream сокетов:
var sendCycle = function(ads) { if (ads.writeFILO.length > 0) { ads.tcpClient.write(ads.writeFILO.shift()); } setTimeout(function() { sendCycle(ads); }, 0); }
Я обращаюсь к socket.write(data, [encoding], [callback])
API :
Опциональный параметр обратного вызова будет выполнен, когда данные окончательно выписаны – это может быть не сразу.
Итак, настройте очередь (массив в порядке), который содержит отправленные сообщения.
Когда вызывается вышеупомянутый обратный вызов, проверьте очередь и отправьте при необходимости.
Это, однако, не гарантирует, что вы ищете, вам придется протестировать. К сожалению, в документах явно не указано, когда есть подтверждение от удаленной конечной точки, что оно действительно получило это сообщение …
В итоге, как вы сделали вывод, TCP – это stream .
Однако интересная идея, которая мне пришла в голову, если вы хотите использовать существующий протокол, тогда откройте два TCP-соединения.
Когда одно соединение подтверждает (независимо от протокола более высокого уровня) получение этого сообщения, отправьте следующее через другое … и т. Д.
Во всяком случае, хороший вызов 🙂
Я знаю, что это старый вопрос, и я не уверен на 100%, я понимаю, что вы ищете, но есть способ сбросить сокет в узел. Сначала вам нужно реализовать class Transform.
См. Здесь, например: https://nodejs.org/api/stream.html#stream_implementing_a_transform_stream .
Затем вы можете взять свой stream и передать его через свое преобразование, прежде чем вставить его в свою розетку.
Я не владею этим модулем узла, но я видел пример этого здесь: https://github.com/yongtang/clamav.js/blob/master/index.js#L8
Я был неправ. TCP – это stream, и протокол работает как stream, но я не обрабатывал его, как stream.
PS: отправка отдельных сообщений, казалось, работала с setImmediate ()