Публикации - Node.js

Ядро Node - Службы прослушивания портов и методы создания серверов

Основная часть ядра Node предназначена для создания служб прослушивания. Существуют node-модули для создания HTTP-сервера, TCP-сервера, TLS-сервера, модуль UDP-сокета, или сокета дейтаграмм.

HTTP-сервер

Большинство стандартных web-приложений запускаются через http-протокол (HyperText Transfer Protocol – протокол передачи гипертекста).

Можно сказать, что HTTP-протокол является частным случаем протокола TCP. Так и в ядре Node.js мудуль для создания протокола HTTP (который так и называется http), наследует функциональность модуля Net (модуль протокола TCP).

Модуль HTTP представляет базовую HTTP-функциональность, обеспечивающую приложению сетевой доступ к запросам и ответам. Рассмотрим пример создания HTTP-сервера:

var http = require(‘http’);
http.createServer(function(req, res){
 res.writeHead(200, {‘content-type’: ‘text/plain’});
 res.end(‘Hello world!’);
 console.log(‘Server running on 8128’);
}).listen(8128); 
console.log(‘Server running on 8128’);

Набираем в браузере http://127.0.0.1:8128 и увидим на экране Hello world!

Следует обратить внимание на важную деталь: если мы запустим еще один процесс, то консоль выдаст ошибку. Система не может слушать один и тот же пор дважды.

Для того чтобы еще раз запустить прослушивание того же порта, необходимо закрыть предыдущее прослушивание.

С помощью функции createServer и безымянной функции обратного вызова создается новый сервер. Входящие параметры функции обратного вызова: req (серверный запрос или поток чтения – это объект http.serverRequest) и res (серверный ответ или поток записи – это объект http.serverResponse).

У объекта http.serverResponse имеются следующие методы:

  • res.writeHead(), который отправляет заголовок ответа с кодом статуса ответа.

  • res.write(), который выводит данные на экран без сигнала о завершении переадчи данных. Может вызываться множество раз.

  • res.end(), который подает сигнал о завершении переадчи данных и тело ответа для вывода на экран. Может быть вызван только один раз, символизирует об окончании вывода.

  • res.json(), выводит в формате JSON.

  • res.send(), выводит один раз и заканчивает вывод (также как res.end()).

Метод http.Server.listen прослушивает входящие подключения к заданному порту. Метод listen является асинхронным, т.е. не блокирует выполнение программы в ожидании подключения. Поэтому, функция console.log() листинга может выполниться раньше подключения.

Кроме потока чтения и записи, HTTP поддерживает кодировку фрагментированной передачи. Этот тип кодировки применяется для обработки больших объемов данных. При этом запись данных может начаться еще до получения оставшейся части запрошенных данных.

Модули Net и HTTP могут также подключаться к UNIX-сокету, а не к конкретному сетевому порту, что позволяет поддерживать взаимодействие между процессами в пределах одной и той же системы.

Протокол TCP

Протокол TCP (Transmission Control Protocol – протокол управления передачей) является базовым для многих интернет-приложений.

Для создания TCP-сервера и TCP-клиента, имеется встроенный модуль Net.

Мы можем создать сервер, передавая функцию обратного вызова с единственным аргументом функции – экземпляром сокета, прослушивающего два события: получение данных и закрытие соединения клиентом. Создадим в отдельном файле (например, server.js) сервер с помощью следующего листинга.

var net = require('net');
var server = net.createServer(function(conn){
  console.log('connected');
  conn.on('data', function(data){
      console.log( data+ ' от ' + conn.remoteAddress + ' ' + conn.remotePort);
      conn.write(data + ' - никому.');
  });
  conn.on('close', function(){
      console.log('client closed connection');
  })
}).listen(8125);

Посредством метода on назначаются два прослушивателя событий. Первым параметром метод принимает имя события, вторым – функцию прослушиватель.

Создание TCP-клиента. Для этого создадим отдельный файл (например, client.js), и в нем напишем следующее:

var net = require('net');
var client = new net.Socket();
client.setEncoding('utf8');
client.connect(8125, 'localhost', function(){
  console.log('connected to Server');
  client.write('Кому нужен браузер?');
});
process.stdin.resume(); // подготовка к вводу данных с консоли
process.stdin.on('data', function(data){
    client.write(data);
});
client.on('data', function(data){
    console.log(data);
});
client.on('close', function(){
    console.log('connection is closed');
})

Итак, у нас готовы два файла, один из которых является клиентом, второй – сервером.

Клиентское приложение отправляет только что набранную строку, которую сервер выводит в консоль и отвечает клиенту, дублируя эту строку и добавляя свою.

Чтобы протестировать эти node-приложения, запустим две консоли. В первой запустим приложение сервера:

node server.js

После чего запустим клиента.

node client.js

После запуска сервера и клиента получим следующие ответы:

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

Соединение между клиентом и сервером поддерживается до тех пор, пока не будет прервано с одной из сторон. В режиме REPL – это комбинация клавиш Ctrl+C. Сведения об этом выводятся на консоль. Например, при закрытии клиента увидим следующее:

Количество комментариев: 0

Для того, чтобы оставить коментарий необходимо зарегистрироваться