Есть ли способ сделать синхронное чтение TCP-сокета в node.js?Синхронный TCP-чтение в Node.js
Я хорошо осведомлен о том, как это сделать асинхронно путем добавления обратного вызова события сокета «данные»:
socket.on('data', function(data) {
// now we have the string data to do whatever with
});
Я также знаю, что пытается блокировать с вызовом функции вместо регистрации обратные вызовы идут против дизайна узла, но мы пытаемся обновить старый модуль узла, который действует как клиент для моего университета, сохраняя обратную совместимость. Таким образом, в настоящее время мы имеем:
var someData = ourModule.getData();
Где getData()
ранее имел кучу логики позади него, но теперь мы просто хотим, чтобы отправить на сервер «запустить GetData()» и ждать результата. Таким образом, вся логика - это серверная, а не дублированная клиентская и серверная стороны. Этот модуль уже поддерживает TCP-соединение с сервером, поэтому мы просто соглашаемся с этим.
Вот решение, которые я пробовал:
Найти блокирующую функцию чтения для сокета скрытого где-то похоже на библиотеку сокетов питона в сети модуля узла.
string_from_tcp = socket.recv(1024)
Проблема в том, что она не существует (неудивительно, потому что она идет против идеологии узла).
Этот syncnet module добавляет то, что мне нужно, но не поддерживает Windows; поэтому я должен добавить это.
Найти функцию, которая позволяет узлу-х разблокировать цикл событий, а затем вернуться обратно, так что это работает:
var theData = null; clientSocket.on('data', function(data) { theData = data; }); clientSocket.write("we want some data"); while(theData === null) { someNodeFunctionThatUnblocksEventLoopThenReturnsHere(); // in this function node can check the tcp socket and call the above 'data' callback, thus changing the value of theData } // now theData should be something!
Очевидная проблема здесь состоит в том, что я не думаю, что такая вещь существует.
Использования ECMAScript функция 6 генератора:
var stringFromTcp = yield socketRead(1024);
Проблема здесь состоит в том, что мы будем вынуждать студент обновлять свои клиент JavaScript, чтобы этот новый синтаксис и понимание ES6 находится вне области применения курсов, которые используют это.
Используйте node-gyp и добавьте в наш узел модуль интерфейс к библиотеке TCP C++, которая поддерживает синхронные чтения, такие как asio. Это, вероятно, будет работать, но получение модуля узла для компиляции с помощью перекрестной платформы будет огромной болью. Поэтому я пришел в Stack Overflow, чтобы убедиться, что я не слишком усложняю эту проблему.
Проще говоря, я просто пытаюсь создать программу JavaScript с командной строкой, которая поддерживает синхронные чтения tcp.
Значит, любые другие идеи? И извините заранее, если это кажется кощунственным в контексте проекта узла, и спасибо за любой ввод.
[Это может помочь] (http://socket.io/docs/) – ODelibalta
Спасибо, но я не думаю, что socket.io может что-то сделать для моей проблемы. Он просто запускает асинхронные события, когда все дело в том, что я пытаюсь получить данные с сервера синхронно в коде. – JacobFischer
О, я вижу ... Я просто сделал веб-поиск. [This one] (http://apetuts.com/tutorial/node-js-tcp-sockets/) имеет опцию «sync: true». Это может помочь. Я не читал его полностью. Удачи. – ODelibalta