Créez une salle de discussion avec nodejs
Avec le développement rapide d'Internet, la façon dont les gens communiquent entre eux évolue également constamment. Chat room est une application de messagerie instantanée en ligne qui permet aux utilisateurs de communiquer et d'échanger des informations en temps réel, quelles que soient les restrictions géographiques ou de fuseau horaire. Il existe de nombreuses façons de mettre en œuvre des salles de discussion. Cet article explique comment créer une salle de discussion avec nodejs.
1. Principe de mise en œuvre de base du salon de discussion
Le salon de discussion est un système de messagerie instantanée basé sur un réseau et son principe de mise en œuvre est très simple. Lorsqu'un utilisateur entre dans la salle de discussion, il doit d'abord se connecter au serveur de discussion, et le serveur ajoutera les informations de connexion de l'utilisateur à la liste des utilisateurs de la salle de discussion. Lorsqu'un utilisateur envoie un message à la salle de discussion, le serveur diffuse le message à tous les utilisateurs de la salle de discussion. De plus, le serveur doit également surveiller l'état de connexion de l'utilisateur et les informations sur les utilisateurs déconnectés en temps réel.
2. Préparation
Avant de commencer à créer une salle de discussion, assurez-vous d'avoir installé nodejs et npm. Sinon, vous pouvez vous rendre sur le site officiel de nodejs pour le télécharger et l'installer.
3. Construisez le côté serveur de la salle de discussion
- Créez le projet
Tout d'abord, nous devons créer un projet de salle de discussion dans l'environnement local et télécharger certains modules nécessaires. Créez d'abord un répertoire de projet sur la ligne de commande et saisissez :
mkdir myChatRoom cd myChatRoom
Utilisez ensuite npm pour initialiser le projet :
npm init
Installez ensuite les modules que vous devez utiliser :
npm i express socket.io -S
Dans la commande ci-dessus :
- express est un utilisé le framework Web nodejs, utilisé pour gérer les requêtes et les réponses HTTP.
- socket.io est une bibliothèque de communication en temps réel basée sur l'encapsulation websocket.
- Implémentation du code côté serveur
Dans le répertoire racine du projet, créez le fichier index.js et collez-y le code suivant :
const express = require('express'); const app = express(); const http = require('http').Server(app); const io = require('socket.io')(http); app.use(express.static(__dirname + '/public')); const onlineUsers = {}; const onlineCount = 0; io.on('connection', (socket) => { console.log('a user connected'); socket.on('login', (user) => { socket.nickname = user.username; // check if the user already exists if (!onlineUsers.hasOwnProperty(socket.nickname)) { onlineUsers[socket.nickname] = user.avatar; onlineCount++; } io.emit('login', { onlineUsers, onlineCount, user }); console.log(`user ${user.username} joined`); }); socket.on('chatMessage', (msg) => { io.emit('chatMessage', { nickname: socket.nickname, message: msg }); }); socket.on('disconnect', () => { if (onlineUsers.hasOwnProperty(socket.nickname)) { const userLeft = { username: socket.nickname, avatar: onlineUsers[socket.nickname] }; delete onlineUsers[socket.nickname]; onlineCount--; io.emit('logout', { onlineUsers, onlineCount, user: userLeft }); console.log(`user ${userLeft.username} left`); } }); }); http.listen(3000, () => { console.log('listening on *:3000'); });
Dans le code ci-dessus, nous avons démarré un serveur http et utilisé socket.io Le service HTTP a été mis à niveau pour prendre en charge les websockets. Nous pouvons ensuite voir que nous avons défini plusieurs événements socket :
- Lorsqu'il y a une nouvelle connexion Socket, le serveur enverra l'événement de connexion, et nous afficherons "un utilisateur connecté".
- Lorsqu'un utilisateur se connecte, le serveur enverra un événement de connexion et ajoutera les informations de l'utilisateur à la liste des utilisateurs en ligne, puis le serveur diffusera la liste des utilisateurs en ligne aux autres utilisateurs.
- Lorsqu'un utilisateur envoie un message, le serveur enverra l'événement chatMessage et diffusera le message à tous les utilisateurs en ligne.
- Lorsqu'un utilisateur se déconnecte, le serveur envoie un événement de déconnexion et supprime l'utilisateur de la liste des utilisateurs en ligne.
4. Construisez un client de salle de discussion
- Créez un fichier html
Dans le répertoire public du projet, créez un fichier html et copiez le code suivant dans le fichier :
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Chatroom</title> <style> #nickname { display: none; } #messages { height: 300px; overflow-y: scroll; margin-bottom: 10px; } ul { list-style: none; padding: 0; margin: 0; } li { margin-top: 10px; } img { width: 30px; height: 30px; vertical-align: middle; margin-right: 10px; } </style> </head> <body> <div id="loginPanel"> <p>输入一个昵称:</p> <input type="text" id="nicknameInput"> <button id="submit">进入聊天室</button> </div> <div id="chatroom" style="display:none;"> <div id="nickWrapper"> <img id="avatarImg" src=""/> <span id="nickname"></span> <button id="logout">退出聊天室</button> </div> <div id="messages"></div> <input type="text" id="messageInput" placeholder="请输入聊天信息"> <button id="sendBtn">发送</button> </div> <script src="./socket.io/socket.io.js"></script> <script src="./chat.js"></script> </body> </html>
Dans le code ci-dessus, nous give Le HTML ajoute une zone de saisie de pseudo, un bouton pour entrer dans la salle de discussion, un bouton pour quitter la salle de discussion, un élément avec l'ID "messages", une zone de saisie pour envoyer des messages et un bouton pour envoyer des messages. Parmi eux, la zone de saisie du surnom et le bouton pour accéder à la salle de discussion sont masqués après l'entrée dans la salle de discussion, et le surnom et l'avatar de l'utilisateur en ligne sont affichés.
- Créez le code JS du client de salle de discussion
Créez un fichier chat.js dans le répertoire public et collez-y le code suivant :
const socket = io(); const submitBtn = document.querySelector('#submit'); const logoutBtn = document.querySelector('#logout'); const sendBtn = document.querySelector('#sendBtn'); const messageInput = document.querySelector('#messageInput'); const nicknameInput = document.querySelector('#nicknameInput'); const chatWrapper = document.querySelector('#chatroom'); const loginPanel = document.querySelector('#loginPanel'); const avatarImg = document.querySelector('#avatarImg'); const nickname = document.querySelector('#nickname'); const messages = document.querySelector('#messages'); let avatar; // 提交昵称登录 submitBtn.addEventListener('click', function () { const nickname = nicknameInput.value; if (nickname.trim().length > 0) { avatar = `https://avatars.dicebear.com/api/bottts/${Date.now()}.svg`; socket.emit('login', { username: nickname, avatar: avatar }); } else { alert('昵称为空,请重新输入'); nicknameInput.value = ''; nicknameInput.focus(); } }); // 退出登录 logoutBtn.addEventListener('click', function () { socket.disconnect(); }); // 发送消息 sendBtn.addEventListener('click', function () { const msg = messageInput.value.trim(); if (msg.length > 0) { socket.emit('chatMessage', msg); messageInput.value = ''; messageInput.focus(); } }); // 回车发送消息 messageInput.addEventListener('keyup', function (e) { e.preventDefault(); if (e.keyCode === 13) { sendBtn.click(); } }); // 服务器发送登录信号 socket.on('login', (info) => { loginPanel.style.display = 'none'; chatWrapper.style.display = 'block'; avatarImg.src = avatar; nickname.innerText = nicknameInput.value; renderUserList(info.onlineUsers); }); // 服务器发送聊天消息信号 socket.on('chatMessage', (data) => { renderChatMessage(data.nickname, data.message); }); // 服务器发送退出信号 socket.on('logout', (info) => { renderUserList(info.onlineUsers); }); // 渲染在线用户列表 function renderUserList(users) { const list = document.createElement('ul'); Object.keys(users).forEach((nickname) => { const item = ` <li> <img src="${users[nickname]}"/> <span>${nickname}</span> </li> `; list.innerHTML += item; }); chatWrapper.insertBefore(list, messages); } // 渲染聊天消息 function renderChatMessage(nickname, message) { const msg = document.createElement('div'); msg.innerHTML = `<p>${nickname}: ${message}</p>`; messages.appendChild(msg); }
Dans le code ci-dessus, nous avons implémenté les fonctions suivantes :
- Quand un utilisateur Lorsque le bouton "Connexion" est cliqué, un événement "Connexion" est envoyé au serveur, et le serveur est chargé d'ajouter l'utilisateur à la liste "Utilisateurs en ligne" en interne et de transmettre la liste actuelle des "Utilisateurs en ligne" à tous. clients via la diffusion.
- Lorsqu'il y a un message de discussion, le serveur enverra l'événement "chatMessage" et transmettra le contenu du message à tous les clients par diffusion.
- Lorsqu'un utilisateur se déconnecte, la "Liste des utilisateurs en ligne" supprimera l'utilisateur de la liste des utilisateurs et transmettra la liste actuelle des "Utilisateurs en ligne" à tous les clients par diffusion.
5. Exécutez le projet
Accédez au répertoire racine du projet sur la ligne de commande et saisissez la commande suivante pour démarrer le projet :
node index.js
Saisissez ensuite http://localhost:3000/ dans le navigateur pour accéder au serveur et entrez dans la salle de discussion.
6. Résumé
Dans cet article, nous avons implémenté une salle de discussion simple basée sur nodejs et socket.io, qui fournit un moyen simple, stable et efficace de créer une salle de discussion. Bien qu'il ne s'agisse que d'un salon de discussion très basique, je pense que les lecteurs peuvent avoir une compréhension générale de la création d'un salon de discussion avec nodejs grâce à l'introduction et à la pratique de cet article.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Outils d'IA chauds

Undresser.AI Undress
Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover
Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool
Images de déshabillage gratuites

Clothoff.io
Dissolvant de vêtements AI

AI Hentai Generator
Générez AI Hentai gratuitement.

Article chaud

Outils chauds

Bloc-notes++7.3.1
Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

SublimeText3 version Mac
Logiciel d'édition de code au niveau de Dieu (SublimeText3)

L'article traite de l'utilisation Effecte dans React, un crochet pour gérer les effets secondaires comme la récupération des données et la manipulation DOM dans les composants fonctionnels. Il explique l'utilisation, les effets secondaires courants et le nettoyage pour éviter des problèmes comme les fuites de mémoire.

Le chargement paresseux retarde le chargement du contenu jusqu'à ce qu'il soit nécessaire, améliorant les performances du Web et l'expérience utilisateur en réduisant les temps de chargement initiaux et la charge du serveur.

L'article explique l'algorithme de réconciliation de React, qui met à jour efficacement le DOM en comparant les arbres DOM virtuels. Il traite des avantages de la performance, des techniques d'optimisation et des impacts sur l'expérience utilisateur. Compte de charge: 159

L'article traite du curry dans JavaScript, une technique transformant les fonctions mulguments en séquences de fonctions à argument unique. Il explore la mise en œuvre du currying, des avantages tels que des applications partielles et des utilisations pratiques, améliorant le code

Les fonctions d'ordre supérieur dans JavaScript améliorent la concision du code, la réutilisabilité, la modularité et les performances par abstraction, modèles communs et techniques d'optimisation.

L'article explique UseContext dans React, qui simplifie la gestion de l'État en évitant le forage des accessoires. Il traite des avantages tels que les améliorations centralisées de l'État et des performances grâce à des redevances réduites.

L'article discute de la connexion des composants React à Redux Store à l'aide de Connect (), expliquant MapStateToproprop, MapDispatchToprops et des impacts de performances.

L'article discute de la prévention des comportements par défaut dans les gestionnaires d'événements à l'aide de la méthode empêchée dedEfault (), de ses avantages tels que une expérience utilisateur améliorée et des problèmes potentiels tels que les problèmes d'accessibilité.
