Real-Time Web
یکی از جنبههای مهم نرمافزار real-time بودن قضیه است. همه چیز در لحظه ممکن است تغییر کند و application js نباید منتظر refresh از سمت کاربر باشد.
شاید شما این مشکل را با pull request های مداوم حل کنید. ولی آیا این راه درستیست؟ چند درصد request های شما بیهوده است؟
راه حل درست تر این است که هنگام تغییر سرور به نرمافزار سمت کاربر بگوید که تغییر صورت گرفته request بزن یا اینکه واقعاً تغییرات را بگوید.
البته همه جا نیاز به این کار نیست. بعضی دیتاها اصلاً مهم نیستند بعضی نرمافزار ها اینقدر کوچک هستند و بازدید کمی دارند که شما request بیهوده بزنید بهتر است. در کل باید به نسبت جایی که قرار است کار صورت بگیرد به این قضیه نگاه کنید.
WebSockets
شما میتوانید از طریق WebSockets ارتباط دوطرفه داشته باشید اما مشکل اصلی WebSockets این است که مربوط به html5 است. یعنی مرورگرهای زیر پشتیبانی می کنند.
Chrome >= 4
Safari >= 5
iOS >= 4.2
Firefox >= 4
IE >= 9
Opera >= 11
ولی اگر برای شما پشتیبانی از مرورگر های قدیمی مهم نیست. انتخاب خوبیست
var socket = new WebSocket("ws://example.com"); // Then, we can add some event listeners to the socket: // The connection has connected socket.onopen = function(){ /* ... */ } // The connection has some new data socket.onmessage = function(data){ /* ... */ } // The connection has closed socket.onclose = function(){ /* ... */ }
در سمت سرور هم به نسبت زبانتان میتوانید جواب بدهید
nicokaiser/php-websocket -> https://github.com/nicokaiser/php-websocket rlotun/txWebSocket -> https://github.com/rlotun/txWebSocket miksago/node-websocket-server -> https://github.com/miksago/node-websocket-server Socket.IO: the cross-browser WebSocket for realtime apps. -> http://socket.io/
Socket.io
با استفاده از socket.io خیلی راحتتر میتوانید این کار را انجام دهید و با استفاده از کتابخانه javascript هم اکثر مرورگر ها پشتیبانی می کنند.
کد نمونه را ببینید.
کد سمت سرور
var io = require('socket.io').listen(80); io.sockets.on('connection', function (socket) { socket.emit('news', { hello: 'world' }); socket.on('my other event', function (data) { console.log(data); }); });
کد سمت کاربر
<script src="/socket.io/socket.io.js"></script> <script> var socket = io.connect('http://localhost'); socket.on('news', function (data) { console.log(data); socket.emit('my other event', { my: 'data' }); }); </script>