Узнайте, как создать приложение чата из командной строки с помощью SocketIO.

В этом посте мы узнаем, как создать приложение группового чата из командной строки с помощью SocketIO.

Socket.IO обеспечивает двунаправленную связь на основе событий в реальном времени. Это состоит из:

1. сервер Node.js

2. Клиентская библиотека Javascript для браузера (или клиент Node.js)

Что мы узнаем из этого поста:

  • Как создать веб-сокеты
  • Как работает групповой чат
  • Как установить и использовать SocketIO

Подсказка:

Долой правило монолитности. Приветствую модульность! Да здравствует возможность повторного использования!

Позвольте Bit инкапсулировать для вас модули. Bit отслеживает зависимости ваших модулей, тестовые файлы и т. Д. - Когда все будет готово, просто отправьте их в облако Bit, где они могут быть обнаружены и использованы вашей командой или всем сообществом разработчиков ПО. Bit организует ваши модули в коллекции, НО каждый модуль можно совместно использовать и устанавливать индивидуально 😮

Настройка / установка проекта

Сначала мы создаем проект Node:

mkdir node-stream
cd node-stream
npm init -y

Теперь устанавливаем библиотеку socket.io:

npm i socket.io

Теперь у socket.io есть клиентская библиотека, которая будет использоваться клиентом для связи с сервером socket.io:

npm i socket.io-client

Создайте сервер SocketIO

Теперь мы создадим наш сервер Websocket. Для этого создадим файл chat-node.js

touch chat-node.js

Затем мы добавляем следующее в файл chat-node.js:

const http = require('http').createServer();
const io = require('socket.io')(server);
const port = 3000
io.on('connection', (socket) => {
    log('connected')
})
io.on('disconnect', (evt) => {
    log('disconnected')
})
http.listen(port, () => log(`server listening on port: ${port}`))

Вышеупомянутое присоединяет socket.io к простому HTTP-серверу Node.JS, который прослушивает порт 3000.

SocketIO основан на событиях, вы настраиваете события с помощью его обработчика, и когда событие генерируется, запускается соответствующий обработчик. Для настройки событий используется метод .on, он принимает два параметра, первый - это строка, содержащая имя события, а второй параметр - это обратный вызов функции.

Событие подключения генерируется при установлении соединения. Аргумент socket следует использовать в дальнейшем общении с клиентом.

Событие отключения генерируется, когда клиент отключается от сервера.

Теперь, когда мы настроили наш сервер сокетов, давайте посмотрим, как подключиться к серверу.

Создайте клиент SocketIO

Создаем файл chat-client.js

touch chat-client.js

Теперь добавьте приведенный ниже код в файл chat-client.js:

var socket = require('socket.io-client')('http://localhost:3000');
  const repl = require('repl')
  const chalk = require('chalk');
  socket.on('disconnect', function() {
      socket.emit('disconnect')
  });
  socket.on('connect', () => {
      console.log(chalk.red('=== start chatting ==='))
  })
  socket.on('message', (data) => {
      const { cmd, username } = data
      console.log(chalk.green(username + ': ' + cmd.split('\n')[0]));
  })

  repl.start({
      prompt: '',
      eval: (cmd) => {
          socket.send(cmd)
      }
  })

Нам потребовалась библиотека socket.io-client, она вернула функцию, которую мы вызвали, передав URL-адрес сервера http://localhost:3000. Помните, что мы создали сервер через порт 3000, поэтому мы ссылаемся на порт 3000. Это дает нам канал сокета к серверу WebSocket для связи. С socket мы можем отправлять сообщения на сервер.

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

Настраиваем различные прослушиватели событий:

connect: запускается, когда клиент устанавливает успешное начальное соединение с сервером. Здесь мы делаем так, чтобы обработчик отображал '=== start chatting ===' красным цветом с помощью мела.

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

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

Затем, в последний раз, мы вызвали метод запуска repl. Функция в свойстве eval всякий раз, когда мы вводим что-либо в терминал и нажимаем Enter. Таким образом, аргумент cmd содержит типизированное сообщение, и мы использовали метод send в API сокета для отправки сообщения на сервер.

Каждый раз, когда вызывается метод send, вызывается сервер, и сервер, если у него есть зарегистрированный сокет, получает сообщение, это событие message будет запущено, и будет вызван его обработчик.

Отправка сообщений туда и обратно

Теперь в нашем chat-node.js обработчик события подключения получает сокет в своем аргументе,

io.on('connection', (socket) => {
    log('connected')
})

давайте воспользуемся им, чтобы зарегистрировать message событие.

io.on('connection', (socket) => {
    log('connected')
    socket.on('message', (evt) => {
    })
})

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

io.on('connection', (socket) => {
    log('connected')
    socket.on('message', (evt) => {
        log(evt)
        socket.broadcast.emit('message', evt)
    })
})

Теперь, если два человека запускают chat-client.js и человек 1 отправляет сообщение «I'm person1», сообщение будет получено сервером в событии message, а вызов socket.broadcast.emit отправит сообщение человеку. 2 и person1, все подключены к потоку сокетов.

См. Вызов socket.broadcast.emit('message', evt), первый параметр указывает событие, которое будет сгенерировано на всех подключенных сокетах, в данном случае это событие message, и их соответствующие обработчики будут запускаться, передавая evt передаваемое сообщение.

Запуск его

Чтобы запустить его, мы запускаем chat-node.js в одном терминале и chat-client.js в другом терминале.

См. Зарегистрированный сервер server listening on port: 3000. Теперь откройте другой терминал и запустите chat-client.js

Посмотрите, на сервере он зарегистрирован connected, что обработчик соединения запущен, потому что мы подключили сокет.

Откройте другой терминал и запустите chat-client.js

Смотрите, как зарегистрировано другое подключенное

Теперь на двух созданных нами клиентских терминалах введите сообщение на одном терминале и нажмите Enter.

Смотрите, это появилось на втором терминале. Теперь введите на втором терминале и нажмите Enter:

Смотрите, это появилось на первом терминале.

Делать это весело

Чтобы было веселее, давайте добавим имя пользователя, чтобы пользователи могли подключаться по своим именам, и когда кто-либо пишет сообщения, мы можем видеть, кто написал сообщение.

Давайте добавим переменную имени пользователя в chat-client.js:

var socket = require('socket.io-client')('http://localhost:3000');
  const repl = require('repl')
  const chalk = require('chalk');
  var username = null
//...

Теперь мы получим имя пользователя из терминала при подключении следующим образом: node chat-client nnamdi. Это будет сделано в событии connect:

// ...
  socket.on('connect', () => {
      console.log(chalk.red('=== start chatting ==='))
      username = process.argv[2]
  })

Имя извлекается и сохраняется в переменной имени пользователя.

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

// ...
repl.start({
      prompt: '',
      eval: (cmd) => {
          socket.send({ cmd, username })
      }
  })

Обработчик событий сообщения должен быть изменен, чтобы преобразовать вышеуказанный объект в имя пользователя и cmd.

// ...
  socket.on('message', (data) => {
      const { cmd, username } = data
      console.log(chalk.green(username + ': ' + cmd.split('\n')[0]));
  })

Видите, он отобразит имя пользователя с точкой с запятой и сообщением.

Давай проверим. Закройте наши предыдущие клиентские терминалы.

Теперь, чтобы подключиться к серверу, мы должны добавить наше имя пользователя в node chat-client. ОК, откройте новый терминал и введите node chat-client nnamdi. Здесь nnamdi - имя пользователя.

Давайте откроем еще один: node chat-client peter

Теперь на nnamdi терминале введите Hello I'm nnamdi

См. На peter терминале он отображается как nnamdi: Hello I'm nnamdi.

Также на терминале peter введите Hello i'm peter

На nnamdi терминале он отображается как peter: Hello I'm peter

Заключение

Это очень просто: если вы знаете правильные методы в API, вы сможете воспроизвести большую часть функций популярного приложения. Есть и другие функции, которые нужно добавить, я как читатель призываю значительно расширить это, вы можете создать следующее большое приложение для чата для следующего миллиарда пользователей.

Если у вас есть какие-либо вопросы относительно этого или чего-либо, что я должен добавить, исправить или удалить, не стесняйтесь комментировать, писать мне по электронной почте или в прямой переписке.

Спасибо !!!

Полный код

Учить больше