Модуль Net
Цель
Ознакомится с модулем Net и его основными методами.
Предварительныетребования
Установленны Node.js и npm
Умение работать с модулями Node.js
Знания работы с событиями
Ознакомиться с потоками
Определение и методы
Модуль Net предоставляет асинхронное сетевое API для создания как серверов, так и клиентов, основанных на потоках. Этот модуль можно включить через require(‘net’)
.
Список и определение всех методов данного модуля и его классов можно посмотреть в документации.
Рассмотри методы модуля, которые чаще всего используются на практике:
- Метод net.createServer([options][, connectionListener]) создает новый TCP-сервер. Аргумент connectionListener автоматически устанавливается как прослушиватель для события «connection».
net.createConnection() это функция фабрики, которая создает новый net.Socket, немедленно инициирует соединение с
socket.connect()
, а затем возвращает net.Socket, который запускает соединение. Когда соединение установлено, при возвращении сокета будет срабатывать событие «connect». Последний параметр connectListener, если он указан, будет добавлен как слушатель для события «connect» один раз. Возможные вариации:- net.connect(options[, connectListener]) подключается к указанному в опциях адресу или порту.
- net.connect(port[, host][, connectListener]) создает TCP-соединение с портом на хостинге.
- net.connect(path[, connectListener]) cоздает IPC-соединение по пути.
Функция net.connect() является псевдонимом функции net.createConnection(). Также имеет несколько вариантов вызова:
- net.createConnection(options[, connectListener]) подключается к указанному в опциях адресу или порту.
- net.createConnection(port[, host][, connectListener]) создает TCP-соединение с портом на хостинге.
- net.createConnection(path[, connectListener]) cоздает IPC-соединение по пути.
Классы модуля и их методы
Классnet.Serverиспользуется для создания TCP или локального сервера. net.Server – это EventEmitter
с такими событиями:
- listening — Запускается, когда сервер был установлен после вызова server.listen.
- connection — Запускается при создании нового соединения. Объект socket, объект connection доступны для обработчика событий. Socket — это экземпляр net.Socket.
- close — Запускается при закрытии сервера. Обратите внимание: если соединения существуют, это событие не будет выдаваться до тех пор, пока все соединения не будут завершены.
- error — Запускается при возникновении ошибки. Событие ‘close’ будет вызываться непосредственно после этого события.
Самым часто используемым методом данного класса является server.listen(). Метод запускае сервер, который прослушивает подключения. net.Server может быть TCP или IPC-сервером в зависимости от того, что он слушает.
Возможные варианты вызова:
- server.listen(handle[, backlog][, callback])
- server.listen(options[, callback])
- server.listen(path[, backlog][, callback]) для IPC серверов
- server.listen([port][, host][, backlog][, callback]) для TCP серверов
server.listen({
host: 'localhost',
port: 80,
exclusive: true
});
Эта функция асинхронна. Когда сервер начинает прослушиваться, будет выведено событие 'listening'. Последний обратный вызов параметра будет добавлен в качестве слушателя для события 'listening'.
Следующим рассмотрим класс net.Socket. Этот объект является абстракцией TCP или локального сокета. Экземпляры net.Socket реализуют интерфейс дуплексного потока. Они могут быть созданы пользователем и использоваться клиентом (через connect()) или создаваться Node.js и передаваться пользователю через событие ‘connection’ на сервере.
Экземпляры net.Socket являются EventEmitter
со следующими событиями:
- lookup — Запускается после обработки имени хоста, но до соединения. Не применимо к сокетам UNIX.
- connect — Запускается, когда соединение сокета успешно установлено.
- data — Запускается при получении данных. Данные аргумента представляют собой буфер или строку. Кодировка данных устанавливается с помощью socket.setEncoding().
- end — Выдается, когда другой конец сокета отправляет пакет FIN.
- timeout — Запускается, если сокет простаивает из-за неактивности. Используется только для уведомления о простое сокета. Пользователь должен вручную закрыть соединение.
- drain — Запускается, когда буфер записи очищается. Может использоваться для дроссельной загрузки.
- error — Запускается при возникновении ошибки. Событие ‘close’ будет вызываться непосредственно после этого события.
- close — Запускается после полного закрытия сокета. Аргумент has_error является логическим, указывающим, был ли сокет закрыт из-за ошибки передачи.
Рассмотрем несколько методов класса net.Socket:
- new net.Socket([options]) — Создает новый объект сокета.
- socket.connect(port[, host][, connectListener]) — Открывает соединение для данного сокета. Если заданы port и host, то сокет будет открыт как сокет TCP, если host опущен, предполагается localhost.
socket.connect(path[, connectListener]) — Открывает соединение для данного сокета. Если задан путь, сокет будет открыт как сокет Unix для этого пути.
socket.write(data[, encoding][, callback]) — Отправляет данные на сокет. Второй параметр определяет кодировку, если задается строка – по умолчанию его значение
UTF8
.socket.end([data][, encoding]) — Наполовину закрывает сокет, т.е., отправляет пакет
FIN
. Возможно, что сервер будет продолжать отправлять данные. Если заданоdata
, функция эквивалентна вызовуsocket.write(data, encoding)
в связке с вызовомsocket.end()
.socket.destroy([exception]) — Обеспечивает, чтобы в этом сокете не содержалось операций ввода-вывода данных. Необходимо только в случае ошибок (ошибка парсинга или подобная).
socket.pause() — Приостанавливает чтение данных. То есть, события 'data' не будут запускаться. Используется для дросселирования загрузки.
socket.resume() — Возобновляет чтение после вызова
pause()
.
const net = require("net");
const s = new net.Socket();
//server
net.createServer(function (socket) {
console.log("connected");
socket.on('data', function (data) {
console.log(data.toString());
});
}).listen(8080);
// client
s.connect(8080);
s.write('Hello');
s.end();
Практическое задание
Создайте два файла server.js и client.js. В первом файле создайте сервер, который будет слушать порт 8080 и выводить на страницу какой-то текст, а во втором файле подключитесь к этому порту и добавив обработчик события 'data' вывидете текст сос страницы в консоль. Запустите файлы в разных терминалах.