Intereting Posts
По умолчанию Node.js + Express.js не запускается io.on не является функцией Node.js TypeError: Object function Object () {} не имеет метода ‘assign’ Средство межпользовательского доступа Mongoose pre.save () не работает должным образом Магистраль, узел, проверка сеанса, мой метод работает, но скажите, правильно это или нет. Nodejs HTTP-сервер, обрабатывающий несколько запросов, вставляемых в DB Обновление до Grunt приводит к ошибке «Использование константы в строгом режиме» Чтение объекта внутри массива в узлах Ошибка при установке yeoman socket.io – не может заставить его работать, имея 404 на какой-то звонок Как правильно закрыть shutdown socket.io / websocket-client? Можете ли вы пройти аутентификацию с помощью Passport без перенаправления? Электронная функция для чтения локального файла – FS – Не считывание Использование GruntJS для фильтрации развертываемых файлов Как начать nuxt.js на plesk?

Node.js заподлицо сокет после записи

Я реализую протокол 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 ()