Створіть свій чат за допомогою Node.js та Socket.IO (найпростіший спосіб)

У сучасному швидкоплинному цифровому світі чат-системи стали основою багатьох веб-додатків. Від соціальних мереж до платформ електронної комерції, обмін повідомленнями в реальному часі більше не є розкішшю — це вже очікуваний стандарт.

Якщо ви коли-небудь цікавилися, як працюють чат-системи або мріяли створити свою, ви потрапили в правильне місце! Давайте розберемо все по кроках.

Перед тим як перейти до коду, необхідно зрозуміти кілька основних термінів для будь-якого додатку для комунікації в реальному часі — Socket (сокет) і порт.

Давайте спростимо. Уявіть, що сервер — це будівля, а клієнти — це люди. Наша мета? Допомогти двом людям спілкуватися через цю будівлю (сервер).

Ось як це працює:

  • Будівля (сервер) має унікальне місце — IP-адресу.
  • Усередині будівлі є різні кімнати (порти), кожна з яких надає певну послугу.

Тепер давайте подивимося, як Клієнт A і Клієнт B взаємодіють через цю будівлю.

pic

Крок 1: Надсилання повідомлення (Клієнт A)

Клієнт A хоче надіслати повідомлення Клієнту B. Для цього йому потрібен спеціальний пропуск.

Цей пропуск містить:

  • IP-адресу будівлі (для знаходження сервера).
  • Конкретну кімнату (порт), де працює служба доставки повідомлень.

У технічних термінах цей пропуск називається сокетом — поєднання IP-адреси сервера та номера порту. Завдяки цьому пропуску Клієнт A може надіслати своє повідомлення на сервер.

Як тільки повідомлення потрапляє до будівлі, сервер вступає в гру. Він визначає отримувача повідомлення (Клієнта B) та направляє його до правильної кімнати (порту) всередині будівлі.

Крок 2: Отримання повідомлення (Клієнт B)

Тепер поглянемо на сторону Клієнта B.

  1. Сервер доставляє:
    Сервер знає, де знаходиться Клієнт B, завдяки їхньому унікальному сокету (поєднання IP-адреси пристрою Клієнта B та порту). Сервер маршрутизує повідомлення до з’єднання Клієнта B.
  2. Сповіщення:
    Це як стук у двері Клієнта B — “Гей, у тебе є повідомлення!” Сервер відправляє повідомлення безпосередньо Клієнту B через їхнє сокет-з’єднання.
  3. Оновлення в реальному часі:
    Як тільки повідомлення приходить, інтерфейс чату Клієнта B оновлюється в реальному часі, відображаючи повідомлення від Клієнта A.

Комунікаційний цикл

І ось так цикл комунікації завершується!

  • Клієнт A надсилає повідомлення через свій сокет.
  • Сервер отримує його, ідентифікує Клієнта B та доставляє повідомлення до сокета Клієнта B.
  • Клієнт B отримує сповіщення та бачить повідомлення в реальному часі.

Цей обмін відбувається за мілісекунди, створюючи безшовний досвід чату в реальному часі, який ми всі звикли використовувати.

pic

Давайте зробимо це поняття ще зрозумілішим, створивши чат-додаток на основі Node.js. Ми використаємо бібліотеку socket.io для інтеграції сокетів на бекенді та Next.js для реалізації інтерфейсу на фронтенді.

Тепер, коли ми зрозуміли основи комунікації в реальному часі, давайте зробимо наступний крок і створимо чат-додаток, використовуючи Node.js та Socket.IO для бекенду та Next.js для фронтенду.

Чому Socket.IO?

Socket.IO спрощує реалізацію комунікації в реальному часі на основі подій. Він дозволяє серверу та клієнту підтримувати безперервне з’єднання, що дає можливість миттєво доставляти повідомлення без необхідності оновлювати або перезавантажувати сторінку.

Крок 1: Налаштування бекенду за допомогою Node.js

1. Ініціалізація проекту

Почнемо з створення нового проекту та встановлення необхідних залежностей.

mkdir chat-app  
cd chat-app  
npm init -y  
npm install express socket.io cors dotenv

2.

Напишемо серверний код

Створіть файл з ім'ям server.js та налаштуйте сервер з Socket.IO.

const express = require("express");  
const http = require("http");  
const { Server } = require("socket.io");  
require("dotenv").config();
const app = express();  
const server = http.createServer(app);
const io = new Server(server, {  
 cors: {  
 origin: process.env.FRONTEND_URL, // Замініть на вашу URL-адресу фронтенду  
 credentials: true,  
 },  
});
// Зберігаємо підключених клієнтів  
const clients = {};
io.on("connection", (socket) => {  
 console.log(`Користувач підключився: ${socket.id}`);
// Надсилаємо ID сокета клієнту  
 socket.emit("your-socket-id", socket.id);
// Реєструємо клієнта  
 clients[socket.id] = socket;
// Обробка приватних повідомлень  
 socket.on("private-message", ({ recipientId, message }) => {  
 if (clients[recipientId]) {  
 clients[recipientId].emit("private-message", {  
 senderId: socket.id,  
 message,  
 });  
 } else {  
 console.log(`Отримувач ${recipientId} не знайдений.`);  
 }  
 });
// Обробка відключення  
 socket.on("disconnect", () => {  
 console.log(`Користувач відключився: ${socket.id}`);  
 delete clients[socket.id];  
 });  
});
const PORT = process.env.PORT || 5000;  
server.listen(PORT, () => console.log(`Сервер працює на порту ${PORT}`));

3. Налаштування змінних середовища

Створіть файл .env для зберігання налаштувань, таких як URL-адреса фронтенду.

dotenv
FRONTEND_URL=http://localhost:3000  
PORT=5000

Запустіть сервер:

node server.js

Крок 2: Створення фронтенду за допомогою Next.js

1. Створіть новий проект Next.js

npx create-next-app@latest chat-app-frontend  
cd chat-app-frontend  
npm install socket.io-client

2. Реалізація інтерфейсу чату

Створіть нову сторінку з ім'ям pages/chat.js.

import { useEffect, useState } from "react";  
import { io } from "socket.io-client";
const Chat = () => {  
 const [mySocketId, setMySocketId] = useState("");  
 const [recipientId, setRecipientId] = useState("");  
 const [message, setMessage] = useState("");  
 const [messages, setMessages] = useState([]);
useEffect(() => {  
 // Підключаємося до сервера Socket.IO  
 const socket = io("http://localhost:5000");
// Отримуємо ID сокета  
 socket.on("your-socket-id", (socketId) => {  
 setMySocketId(socketId);  
 });
// Слухаємо вхідні приватні повідомлення  
 socket.on("private-message", (data) => {  
 setMessages((prev) => [  
 ...prev,  
 { sender: `Користувач ${data.senderId}`, message: data.message },  
 ]);  
 });
return () => {  
 socket.disconnect();  
 };  
 }, []);
const sendMessage = () => {  
 const socket = io("http://localhost:5000");  
 socket.emit("private-message", { recipientId, message });  
 setMessages((prev) => [  
 ...prev,  
 { sender: "Ви", message },  
 ]);  
 setMessage("");  
 };
return (  

Chat App  
Your Socket ID: {mySocketId}  
 setRecipientId(e.target.value)}    />     setMessage(e.target.value)}    />    Send    
Messages  
    {messages.map((msg, index) => (    

 {msg.sender}: {msg.message}  

    ))}    
    );  
};  
export default Chat;  

3. Оновлення змінних середовища

Переконайтесь, що URL сервера бекенду відповідає тому, що зазначено у файлі .env вашого бекенду.

Крок 3: Тестування чат-додатку

  1. Запустіть сервер бекенду:

    • node server.js
  2. Запустіть додаток Next.js:

    • npm run dev
    • Відкрийте чат-додаток у двох вікнах браузера або на різних пристроях.
      Скопіюйте ID сокета одного клієнта і використовуйте його як ID отримувача для надсилання повідомлень.

Висновок

Всього кілька рядків коду — і ви побудували функціональний чат в реальному часі! Цей проєкт демонструє можливості Socket.IO та Next.js, і ви можете розширити його, додавши такі функції, як групові чати, індикатори набору тексту чи автентифікацію користувачів.

Перекладено з: Make your chat application(understand the easiest way )-nodejs-socket.io

Leave a Reply

Your email address will not be published. Required fields are marked *