Как настроить Socket.IO с помощью приложения Demo-Chat в Node.js?

Опубликовано: 31 Июля, 2021

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

Предпосылка:

  1. Node.js: это внутренняя технология JavaScript с открытым исходным кодом, выполняемая сервером. У него есть собственный менеджер пакетов npm (Node Package Manager), который позволяет легко устанавливать пакеты.
  2. Expess.js: это фреймворк, основанный на Node.js.
  3. Socket.io: обеспечивает двунаправленную связь на основе событий в реальном времени. Он работает на любой платформе, браузере или устройстве, уделяя одинаковое внимание надежности и скорости. Socket.IO построен на основе API WebSockets (на стороне клиента) и Node.js. Это один из самых зависимых от библиотеки npm.

Настройка среды: Самый первый шаг - запустить npm. Итак, создайте новый репозиторий и инициализируйте npm, используя следующие команды:

$ mkdir chatApp
$ cd chatApp
$ npm init

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

  • express: фреймворк веб-приложений для Node.js.
  • nodemon: (необязательно) Он используется для перезапуска нашего сервера. Если вы не хотите его устанавливать, просто перезапустите сервер, написав node app.js в терминале.
  • ejs: простой язык шаблонов, позволяющий создавать разметку HTML с помощью обычного JavaScript.
  • socket.io: пакет, который управляет Websocket.

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

$ npm install --save express
$ npm install --save socket.io
$ npm install --save ejs
$ npm install - сохранить nodemon

Шаги по реализации кода:

Шаг 1. Создайте app.js




const express = require( 'express' );
const app = express();
app.set( "view engine" , "ejs" );
app.use(express.static( "public" ));
app.get( "/" , function (req, res) {
res.send( "Welcome to chat app!" );
});
server = app.listen(3000);

Если вы запустите http: // localhost: 3000 в своем браузере, вы увидите сообщение на экране, как показано ниже:

Теперь, чтобы настроить socket.io, мы должны сначала создать объект в файле app.js, как показано ниже:




const io = require( "socket.io" )(server);
io.on( 'connection' , (socket) {
console.log( "New user connected" );
});

Здесь объект io предоставит нам доступ к библиотеке socket.io. Теперь объект io прослушивает каждое подключение к нашему приложению. Каждый раз, когда новый пользователь подключается, он распечатывает следующий вывод:

 Подключен новый пользователь

Теперь для создания окна для приложения чата мы создадим html-файл (на самом деле файл ejs) с именем index.ejs внутри папки представлений. С другой стороны, общая папка будет содержать файл css, а именно style.css и файл js chat.js. Это будет выглядеть так:

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




   
app.get("/", function(req, res) {
    res.render("index.ejs");
});

Теперь, если вы запустите http: // localhost: 3000, наше окно чата будет выглядеть так:

Теперь мы установим socket.io на каждого клиента, который попытается подключиться к нашему серверу. Для этого нам нужно импортировать библиотеку socket.io на стороне клиента:

В конце вашего тела добавьте следующие строки:




<script src=
</script>
<script src= "chat.js" ></script>

Теперь создайте js-файл с именем chat.js в общей папке.




$ ( function () {
var socket = io.connect( ' http://localhost:3000 ' );
});

Шаг 2: Отправка и получение данных Теперь мы напишем код, который позволит нам отправлять данные, а также получать данные с сервера.
Изменение имени пользователя: Прежде всего, мы установим имя пользователя по умолчанию как что-то, скажем, «Xyz». Для этого запишите следующий код в файлы app.js и chat.js.

Имя файла: app.js




const io = require( "socket.io" )(server);
io.on( 'connection' , (socket) {
console.log( "New user connected" );
socket.username= "xyz" ;
socket.on( 'change_username' , (data) {
socket.username = data.username;
});
});

Имя файла: chat.js




$ ( function () {
var socket = io.connect( ' http://localhost:3000 ' );
var message = $( "#message" );
var username = $( "#username" );
var send_message = $( "#send_message" );
var send_username = $( "#send_username" );
var chatroom = $( "#chatroom" );
send_username.click( function () {
console.log(username.val());
socket.emit( 'change_username' ,
{ username : username.val() });
});
});

socket.emit () позволяет генерировать настраиваемые события на сервере и клиенте.

Сообщение: Для сообщений мы изменяем наши файлы, как показано ниже:
Имя файла: chat.js




$ ( function () {
var socket = io.connect( ' http://localhost:3000 ' );
var message = $( "#message" );
var username = $( "#username" );
var send_message = $( "#send_message" );
var send_username = $( "#send_username" );
var chatroom = $( "#chatroom" );
send_message.click( function () {
socket.emit( 'new_message' , { message : message.val() });
});
socket.on( "new_message" , (data) {
console.log(data);
chatroom.append( "<p class='message'>"
+ data.username+ ";" + data.message+ "</p>" )
});
send_username.click( function () {
console.log(username.val())
socket.emit( 'change_username' ,
{username : username.val()})
});
});

Имя файла: app.js




const io = require( "socket.io" )(server);
io.on( 'connection' , (socket) {
console.log( "New user connected" );
socket.username= "xyz" ;
socket.on( 'change_username' , (data) {
socket.username = data.username;
});
socket.on( 'new_message' , (data) {
io.socket.emit( 'new_message' , {
message : data.message,
username : socket.username
});
});
});

Окончательный результат нашего простого чат-приложения будет выглядеть так:

Небольшое улучшение: мы можем еще немного добавить прослушиватель событий jQuery при вводе и отправить событие сокета с именем typing.

Он просто отображается, если кто-то набирает сообщение. Напишите следующий код в chat.js и app.js, как показано ниже:
Имя файла: chat.js




message.bind( "keypress" , () {
socket.emit( 'typing' );
});
socket.on( 'typing' , (data) {
feedback.html( "<p><i>" + data.username
+ " is typing a message..." + "</i></p>" );
});

Имя файла: app.js




socket.on( 'typing' , (data) {
socket.broadcast.emit( 'typing' , {username : socket.username});
});