كيف تبني تطبيق دردشة فوري باستخدام Socket.IO وNode.js
Socket.io هي مكتبة JavaScript تُستخدم لبناء تطبيقات ويب تفاعلية في الوقت الفعلي. تُتيح هذه المكتبة للعملاء والخوادم التواصل مع بعضهم البعض بشكل مباشر، مما يسمح بإنشاء تطبيقات ويب ديناميكية تُحدث نفسها تلقائيًا دون الحاجة إلى إعادة تحميل الصفحة.
المقبس.io: مكتبة جافا سكريبت تسمح بالاتصال ثنائي الاتجاه بين خوادم Node.js وعملاء الويب. يوفر Switch.io طريقة بسيطة للاتصال الفوري بين الخوادم والعملاء، مما يسمح بتطبيقات الويب الديناميكية والتفاعلية في الوقت الفعلي.
مميزات استخدام Socket.io:
- تواصل في الوقت الفعلي:تُتيح Socket.io للعملاء والخوادم التواصل مع بعضهم البعض بشكل مباشر دون الحاجة إلى إعادة تحميل الصفحة.
- سهولة الاستخدام:تُقدم Socket.io واجهة برمجة تطبيقات بسيطة وسهلة الاستخدام.
- قابلية التوسع: تُمكن Socket.io من بناء تطبيقات ويب قابلة للتوسع يمكنها التعامل مع عدد كبير من المستخدمين.
- دعم مختلف اللغات: تدعم Socket.io مختلف لغات البرمجة، بما في ذلك NodeJS و Python و Java.
شرح استخدام Socket.io في NodeJS:
تثبيت socket.io
npm i socket.io
إنشاء خادم NodeJS
const { join } = require('path');
const http = require('http');
const express = require('express');
const app = express();
const { Server } = require('socket.io');
const server = http.createServer(app);
const io = new Server(server);
app.get('/', (req, res) => {
res.sendFile(join(__dirname, 'index.html'));
});
io.on('connection', (socket) => {
console.log('someone connected!');
socket.on('message', (msg) => {
console.log('message :' + msg);
// إرسال الرسالة إلى جميع العملاء المتصلين باستثناء المرسل
// socket.broadcast.emit('send_to_all_users', msg);
// إرسال الرسالة إلى جميع العملاء المتصلين حتى المرسل
io.emit('send_to_all_users', msg);
});
});
server.listen(3000, (() => {
console.log("server is running");
}));
إنشاء ملف html لتجربة ال stream مع Socketio
1. Head Section
2. Body Section
<html>
<head>
<meta name="viewport" content="width=device-width,initial-scale=1.0">
<title>Socket.IO chat</title>
<style>
body { margin: 0; padding-bottom: 3rem; font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif; }
#form { background: rgba(0, 0, 0, 0.15); padding: 0.25rem; position: fixed; bottom: 0; left: 0; right: 0; display: flex; height: 3rem; box-sizing: border-box; backdrop-filter: blur(10px); }
#input { border: none; padding: 0 1rem; flex-grow: 1; border-radius: 2rem; margin: 0.25rem; }
#input:focus { outline: none; }
#form > button { background: #333; border: none; padding: 0 1rem; margin: 0.25rem; border-radius: 3px; outline: none; color: #fff; }
#messages { list-style-type: none; margin: 0; padding: 0; }
#messages > li { padding: 0.5rem 1rem; }
#messages > li:nth-child(odd) { background: #efefef; }
</style>
</head>
<body>
<ul id="messages"></ul>
<form id="form" action="">
<input id="input" autocomplete="off" /><button>Send</button>
</form>
<script src="/socket.io/socket.io.js"></script>
<script>
const socket = io();
const form = document.getElementById('form');
const input = document.getElementById('input');
const messages = document.getElementById('messages');
form.addEventListener('submit', (e) => {
e.preventDefault();
if (input.value) {
socket.emit('message', input.value);
input.value = '';
}
});
socket.on('send_to_all_users', (msg) => {
const item = document.createElement('li');
item.textContent = msg; // Use data instead of msg
messages.appendChild(item);
window.scrollTo(0, document.body.scrollHeight);
});
</script>
</script>
</body>
</html>
io.on('connection', (socket) => {
console.log('someone connected!');
socket.on('message', (msg) => {
console.log('message :' + msg);
// إرسال الرسالة إلى جميع العملاء المتصلين باستثناء المرسل
// socket.broadcast.emit('send_to_all_users', msg);
// إرسال الرسالة إلى جميع العملاء المتصلين حتى المرسل
io.emit('send_to_all_users', msg);
});
socket.on('typing',()=>{
socket.broadcast.emit('show_typing');
});
socket.on('stop_typing',()=>{
socket.broadcast.emit('clear_typing');
});
});كود html لعمل تتبع لحالة الكتابة بواسطة Socket Io
إرسال إشعار بدء الكتابة:
استقبال إشعار بدء كتابة من مستخدم آخر:
إرسال إشعار إيقاف الكتابة:
استقبال إشعار إيقاف كتابة من مستخدم آخر:
<html>
<head>
<meta name="viewport" content="width=device-width,initial-scale=1.0">
<title>Socket.IO chat</title>
<style>
...
</style>
</head>
<body>
<ul id="messages"></ul>
<form id="form" action="">
<p id="typingState" ></p>
<input id="input" autocomplete="off" /><button>Send</button>
</form>
<script src="/socket.io/socket.io.js"></script>
<script>
...
input.addEventListener('keydown',()=>{
socket.emit('typing');
});
socket.on('show_typing',()=>{
typingState.innerHTML = 'clinet is Typing...'
});
input.addEventListener('keyup',()=>{
socket.emit('stop_typing');
});
socket.on('clear_typing',()=>{
setTimeout(()=>{
typingState.innerHTML = '';
},2000)
});
</script>
</script>
</body>
</html>
استخدام Socket بدون ادراج ملف html بداخلها
app.get('/', (req, res) => {
res.sendFile(join(__dirname, 'index.html'));
});const cors = require('cors');
app.use(cors());
const io = new Server(server, {
cors: {
origin: "http://localhost:8080"
}
});<script src="https://cdn.socket.io/4.7.5/socket.io.min.js" integrity="sha384-2huaZvOR9iDzHqslqwpR87isEmrfxqyWOF7hr7BY6KG0+hVKLoEXMPUJw3ynWuhO" crossorigin="anonymous"></script>



