2015-08-13 4 views
3

Есть ли способ сделать синхронное чтение 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-соединение с сервером, поэтому мы просто соглашаемся с этим.

Вот решение, которые я пробовал:

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

    string_from_tcp = socket.recv(1024) 
    

    Проблема в том, что она не существует (неудивительно, потому что она идет против идеологии узла).

  2. Этот syncnet module добавляет то, что мне нужно, но не поддерживает Windows; поэтому я должен добавить это.

  3. Найти функцию, которая позволяет узлу-х разблокировать цикл событий, а затем вернуться обратно, так что это работает:

    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! 
    

    Очевидная проблема здесь состоит в том, что я не думаю, что такая вещь существует.

  4. Использования ECMAScript функция 6 генератора:

    var stringFromTcp = yield socketRead(1024); 
    

    Проблема здесь состоит в том, что мы будем вынуждать студент обновлять свои клиент JavaScript, чтобы этот новый синтаксис и понимание ES6 находится вне области применения курсов, которые используют это.

  5. Используйте node-gyp и добавьте в наш узел модуль интерфейс к библиотеке TCP C++, которая поддерживает синхронные чтения, такие как asio. Это, вероятно, будет работать, но получение модуля узла для компиляции с помощью перекрестной платформы будет огромной болью. Поэтому я пришел в Stack Overflow, чтобы убедиться, что я не слишком усложняю эту проблему.

Проще говоря, я просто пытаюсь создать программу JavaScript с командной строкой, которая поддерживает синхронные чтения tcp.

Значит, любые другие идеи? И извините заранее, если это кажется кощунственным в контексте проекта узла, и спасибо за любой ввод.

+1

[Это может помочь] (http://socket.io/docs/) – ODelibalta

+0

Спасибо, но я не думаю, что socket.io может что-то сделать для моей проблемы. Он просто запускает асинхронные события, когда все дело в том, что я пытаюсь получить данные с сервера синхронно в коде. – JacobFischer

+0

О, я вижу ... Я просто сделал веб-поиск. [This one] (http://apetuts.com/tutorial/node-js-tcp-sockets/) имеет опцию «sync: true». Это может помочь. Я не читал его полностью. Удачи. – ODelibalta

ответ

2

Я закончил с вариантом 5. Я нашел небольшую, быструю и легкую для сборки библиотеку TCP в C++ (netLink) и написал для нее обертку модуля узла, метко назвав ее netlinkwrapper.

Модуль построен на Windows и Linux, но поскольку это аддон C++, вам понадобится node-gyp, сконфигурированный для его создания.

Я надеюсь, что никто не должен вставлять Node.js, как я использовал этот модуль, но если вы должны заблокировать цикл событий с помощью TCP-вызовов, это, вероятно, ваша единственная ставка.

+0

Святая корова, это на самом деле работает! Вы просто спасли мне дни работы! Ty !!! –

Смежные вопросы