2013-08-02 2 views
2

Резюме: Как я могу использовать Node.js, чтобы узнать, слушает ли что-то на данном порту?Как проверить, что служба прослушивает TCP с помощью Node.js?

Детали:

Я пишу тесты для приложения HTTP на основе в узле.

я расширил узел http.Server с util.inherits, и в результате «класс» завернуть стандартную функциональность .listen() в методе моих называется .start(). Этот метод выполняет некоторую настройку (например, подключается к MongoDB), а затем вызывает http.Server.listen(port, cb), когда все идет хорошо.

Моя проблема: я хотел бы написать тест, который вызывает .start(), а затем проверяет, что сервер действительно прослушивает указанный порт. Я хотел бы сделать это без отправки HTTP-запроса для сервера. Я просто хочу проверить, что сервер слушает.

К сожалению, я не знаком с TCP, но, учитывая мой опыт работы с сканирования портов и netstat и вещи такого рода, у меня сложилось впечатление, что что-то в net пакете узла позволит мне сделать это. Это возможно?

+0

Почему бы не использовать обратный вызов '.listen()' и доверие к тому, что собственные модульные тесты Node.js поймут проблемы с ним? – Brad

+0

@Brad, несколько причин: (i) Я хочу узнать, как использовать TCP и пакет 'net'; (ii) Я хочу написать набор тестов, который может определить, был ли сервер запущен или остановлен без использования каких-либо других функций. Дело не в том, что я не доверяю слушанию Узла или его испытаниям, но я хочу знать, что это произошло, _программически. –

+0

Вы пробовали простой пример в документации? Это очень просто. http://nodejs.org/api/net.html#net_net_connect_options_connectionlistener – Brad

ответ

7

Использование net.connect():

var net = require('net'); 
var client = net.connect({port: 8124}, 
function() { //'connect' listener 
    console.log('client connected'); 
    client.end(); 
}); 

Node.JS documentation на net модуль

+1

В соответствии с документацией, я полагаю, вы имели в виду 'net.createConnection' вместо' net.connect' https://nodejs.org/api/net.html#net_net_createconnection_options_connectlistener вы также могли бы просто использовать 'net.connect (порт [, host] [, connectListener]) ' – seveibar

2

Почему? Вам все равно, если что-то слушает, если вы хотите подключиться к нему. Итак, подключитесь к нему и обработайте ошибку. «Не проверяйте, не используйте». Это относится к любому ресурсу. Лучший способ проверить, доступно ли это, - попытаться использовать его.

+0

Цените свою опытную перспективу, @EJP. То, что вы делаете, очевидно, не из тех, кто спорит, видя, что это имеет большой смысл. Тем не менее, я, возможно, излишне, написав спецификацию с помощью тестов, и я бы хотел быть в состоянии удовлетворить тесты и изолировать зависимости как можно больше. Часть этого является чисто академической, поскольку я уже сделал то, что вы предложили: у меня уже есть набор неинтерфейсных функциональных тестов с использованием HTTP-клиента, который просто запускается через вызовы API-клиента. Очевидно, что если служба не прослушивает, вы не получите HTTP-ответов: D –

+1

@downvoter Я отмечаю, что этот ответ согласен с принятым. – EJP

3

Я не знаю, что node.js предложения, но вот способ проверить, если что-то прослушивает порт без установления соединения с ним:

Этот метод часто называют половинной открытое сканирование, потому что вы не открываете полное TCP-соединение. Вы отправляете пакет SYN, как будто вы собираетесь открыть реальное соединение, а затем дождитесь ответа. SYN/ACK указывает, что порт прослушивает (открывается), а RST (сброс) указывает на неслушателя.

Это происходит из инструмента сканирования nmap порта, и если вы заинтересованы в низкоуровневый TCP/IP вещи, есть намного больше, чтобы найти на веб-сайте.

+0

Спасибо, Марко за эту деталь! Это объясняет далее, что такое конструкция 'allowHalfOpen'' net.Server'. Документы просто говорят: «Если allowHalfOpen истинно, то сокет не будет автоматически отправлять FIN-пакет, когда другой конец сокета отправляет пакет FIN. Сокет становится нечитаемым, но доступен для записи. Вы должны явно вызвать метод end(). 'Итак, действительно, вы можете построить' net.' или 'http.Servers', которые отвечают таким образом, но с дополнительными оговорками. Я не буду менять свой код-экземпляр только для тестирования, но это очень полезная информация. Спасибо! –

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