Рубрики
Без рубрики

Core Nodejs Часть 1 Разъемы TCP: Создание приложения для чата командной строки

TCP – это стандарт, который определяет, как установлено сетевое соединение и поддерживается между двумя хозяевами

Автор оригинала: Enaho Isiwele.

ВСТУПЛЕНИЕ

Наиболее распространенные подводные камни NODEJS/JavaScript разработчики являются библиотеками. Мое первое введение в Nodejs было выражено. Большинство разработчиков NODEJS не могут действительно отличаться между Express Server и Core Nodejs HTTP-пакетом. Эта статья не покрывает пакет узла HTTP, который будет охвачен более поздним статьями. Вместо этого он направлен на

  1. Работа с узел Net Package
  2. Читайте и запишите в TCP-соединения с помощью розетки
  3. Создайте наши знания из двух и реализуйте простую командную строку в чате, используя сокеты

Nodejs и розетки

В Nodejs есть три основных реализация розетки

  1. UPD: Протокол DataGram пользователя
  2. TCP: протокол управления передачей
  3. Unix Domain.

Эта статья охватывает только реализацию розетки TCP в Nodejs.

Что такое протокол управления передачи (TCP):

TCP – это стандарт, который определяет, как сетевое соединение установлено и поддерживается между двумя хозяевами. TCP и IP (Интернет-протокол) определяет, как компьютер отправляет пакеты данных друг другу. Одно из огромных различий между протоколом TCP и UDP заключается в том, что с целостностью данных TCP гарантированы. Это означает, что если произошла потеря пакетов во время передачи, используя TCP, пакеты получают обратно и повторно отправлены.

Узел Net Package в Action Chat App:

Прямое определение из документации NODEJS заявляет, что сетевой модуль предоставляет асинхронный сетевой API для создания TCP на основе потока

Есть две категории розетки TCP, которые вы можете написать –

  1. сервер
  2. клиент.

Мы будем реализовывать 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 : Мы смогли

  1. Создать TCP-сервер
  2. Прослушивание для подключения
  3. Подключитесь к нашему серверу от клиента
  4. Напишите клиенту, когда они подключаются

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

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, чтобы подключить несколько клиентов и попробуйте отправить сообщение.

Застрел на экране 2017-08-29 в 10.26.47 AM.PNG

Recap : Мы смогли

  1. Сохранить подключенные клиенты
  2. Вещательное сообщение всем сохраненным клиентам

Наконец, давайте улучшим приложение в чате, предоставив клиентам возможность вводить их имена, поэтому мы можем определить, откуда приходит сообщение.

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.

Не стесняйтесь играть с кодом, и попытайтесь уведомлять всех пользователей, когда соединение сделано.