Автор оригинала: Enaho Isiwele.
ВСТУПЛЕНИЕ
Наиболее распространенные подводные камни NODEJS/JavaScript разработчики являются библиотеками. Мое первое введение в Nodejs было выражено. Большинство разработчиков NODEJS не могут действительно отличаться между Express Server и Core Nodejs HTTP-пакетом. Эта статья не покрывает пакет узла HTTP, который будет охвачен более поздним статьями. Вместо этого он направлен на
- Работа с узел Net Package
- Читайте и запишите в TCP-соединения с помощью розетки
- Создайте наши знания из двух и реализуйте простую командную строку в чате, используя сокеты
Nodejs и розетки
В Nodejs есть три основных реализация розетки
- UPD: Протокол DataGram пользователя
- TCP: протокол управления передачей
- Unix Domain.
Эта статья охватывает только реализацию розетки TCP в Nodejs.
Что такое протокол управления передачи (TCP):
TCP – это стандарт, который определяет, как сетевое соединение установлено и поддерживается между двумя хозяевами. TCP и IP (Интернет-протокол) определяет, как компьютер отправляет пакеты данных друг другу. Одно из огромных различий между протоколом TCP и UDP заключается в том, что с целостностью данных TCP гарантированы. Это означает, что если произошла потеря пакетов во время передачи, используя TCP, пакеты получают обратно и повторно отправлены.
Узел Net Package в Action Chat App:
Прямое определение из документации NODEJS заявляет, что сетевой модуль предоставляет асинхронный сетевой API для создания TCP на основе потока
Есть две категории розетки TCP, которые вы можете написать –
- сервер
- клиент.
Мы будем реализовывать Server Side Connection и используя инструмент, называемый NetCat для подключения к нашему серверу.
Если вы используете Mac, то у вас уже есть NetCat установлен. Пользователи Windows могут следовать за этим ссылка Чтобы получить настройку Netcat
const { createServer } = require('net'); const server = createServer(); server.listen(3000)
Вызов метода Create Server из сетевого пакета создает TCP-сервер. Это так просто, как ABC верно? Вызов метода прослушивания на сервере открывается соединение на 3000.
Если мы попытаемся подключиться к этому порту, используя Necat, ничего не происходит.
> nc localhost 3000 // we get nothing
TCP-сервер также является эмиттером событий, поэтому мы можем прослушивать клиентские соединения.
Мощность чистого сокета состоит в том, что это дуплексной поток, что означает, что он реализует как читаемый, так и для записи, и это также эмиттер событий.
Знание этого, мы можем слушать такие события, как когда клиент подключается к нашему порту TCP и отправьте обратные данные к этому клиенту. Давайте посмотрим на это в действии.
const { createServer } = require('net'); const server = createServer(); server.on('connection', (socket) => { socket.write("A client has connected\n") }); server.listen(3000)
Запустите свой сервер, откройте новый терминал и запустите строку ниже
> nc localhost 3000 //prints A client has connected
Вы должны увидеть фразу «Клиент подключен». Если вы попробуйте открыть другой терминал и подключение, вы получите то же сообщение.
Recap : Мы смогли
- Создать TCP-сервер
- Прослушивание для подключения
- Подключитесь к нашему серверу от клиента
- Напишите клиенту, когда они подключаются
Далее нам нужно выяснить, как читать потоки из подключенного клиента. Делая это, мы можем прочитать клиентские входы на сервере и транслировать его каждому подключенному клиенту.
const { createServer } = require('net'); const server = createServer(); let counter = 0; const sockets = {} server.on('connection', (socket) => { socket.id = counter++ sockets[socket.id] = socket; socket.write("A client has connected\n") socket.on('data', data => { Object.entries(sockets).forEach(([key, cs]) => { if(sockets.id != key) { cs.write(data); } }); }) }); server.listen(3000, () => { console.log('server has started') })
Во-первых, мы присваивали удостоверение личности каждому розетку, которое подключается к серверу и добавила этот розетку к глобальному объекту под названием сокетов. Этот глобальный объект содержит все подключенные сокеты, вы можете начать представить, что мы можем сделать с этим.
Из строки 13 вы увидите, как я слушаю входящие данные и зацикливаться через все записи в объекте сокетов. Я использую Object.entries, чтобы создать массив клавиши, Value Pair из всех розетков в разъемах переменную, а затем я использовал деструктурирующую массив для получения ключа и значения, значение было каждой розеткой в объекте. Наконец, я просто пишу данные для всех подключенных сокетов в глобальном объекте.
Чтобы проверить этот запуск сервера и используйте NC, чтобы подключить несколько клиентов и попробуйте отправить сообщение.
Recap : Мы смогли
- Сохранить подключенные клиенты
- Вещательное сообщение всем сохраненным клиентам
Наконец, давайте улучшим приложение в чате, предоставив клиентам возможность вводить их имена, поэтому мы можем определить, откуда приходит сообщение.
const { createServer } = require('net'); const server = createServer(); let counter = 0; let sockets = {} server.on('connection', socket => { socket.id = counter++; console.log('client has connected') socket.write('Please enter your name: ') socket.on('data', data => { if(!sockets[socket.id]) { socket.name = data.toString().trim(); socket.write(`Welcome ${socket.name}!\n`); sockets[socket.id] = socket; return; } Object.entries(sockets).forEach(([key, cs]) => { console.log(`${socket.id}: ${data}`) if (key != socket.id) { cs.write(`${socket.name}: `); cs.write(data); } }) }); socket.setEncoding('utf8'); socket.on('end', data => { delete sockets[socket.id]; Object.entries(sockets).forEach(([keys, sc]) => { sc.write(`${socket.name}: `); sc.write('has disconnected\n'); }) console.log(`${socket.name} has disconnected`) }) }) server.listen(3000, () => console.log('Server started'));
Ничего не было добавлено к этому коду, кроме сбора имени клиента, когда (ы) он подключается к серверу. Я проверил, не существует ли сокета и назначить входящие данные в свойство имя в сокетке пользователя, и, наконец, написал подключенному пользователю приветственное сообщение с их именем.
Еще одно изменение было добавить имя пользователя, отправив сообщение для трансляции в строке 23
Наконец, я слушал, когда пользователь отключается и транслирует, что всем клиенту подключен к серверу, используя прослушиватель Socket.On («End»).
Резюме
Хотя это может быть низкоуровневая реализация розеток, он показывает вам мощность TCP/IP, и она подчеркивает в узле JS.
Мы смогли создать TCP-сервер и подключиться к нему. Мы также читаем и записываем потоки данных до и с помощью нескольких подключенных сокетов TCP, используя события в Nodejs Net.socket.
Не стесняйтесь играть с кодом, и попытайтесь уведомлять всех пользователей, когда соединение сделано.