محمد افاضاتی

دیده ها، شنیده ها و علاقه مندی های یک برنامه نویس
دوشنبه, ۱۷ مهر ۱۳۹۱، ۰۹:۴۷ ق.ظ

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>


نوشته شده توسط محمد افاضاتی
ساخت وبلاگ در بلاگ بیان، رسانه متخصصان و اهل قلم

محمد افاضاتی

دیده ها، شنیده ها و علاقه مندی های یک برنامه نویس
محمد افاضاتی
محمد افاضاتی برنامه نویس python php دیتابیس های postgresql mongodb و ...

رونوشتی از علاقه مندی هایم برای ماندگار تر شدن!

تبلیغات

طبقه بندی موضوعی

Feedburner RSS

Others

توییتر

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>
موافقین ۲ مخالفین ۰ ۹۱/۰۷/۱۷
محمد افاضاتی socket.io nodejs WebSockets realtime node

نظرات  (۲)

دمت گرم اتفاقا یه مورد آموزش دادن از راه دور برام پیش آمده داشتم به این فک میکردم با کمک این روش یه تخته سیاه بیازمو با راه اندازی یه ejabberd صدامم برسونم به یارو، یه کم حوصله کنم حتما راش میندازم ;)
socket.io خیلی خوبه. ولی دوست دارم بدونم چیزی هست که مثلا تو یه زبان دیگه بشه سرورشو اجرا کرد؟ مثلا اینور socket.io باشه طرف سرور چیز دیگه؟
البته مشخصا وب سروری مثل‌آپاچی جواب نمیده، منظورم مثلا php روی nginx ـه
پاسخ:
من خودم تورنادو رو امتحان کردم و کاملا اوکی بود
SocketTornad.IO 0.1.3 : Python Package Index -> http://pypi.python.org/pypi/SocketTornad.IO
و برای nginx هم اینو ببین
جواب قاطعی دادن :D
Nginx and socket.io · LearnBoost/socket.io Wiki -> https://github.com/LearnBoost/socket.io/wiki/Nginx-and-Socket.io

ارسال نظر

ارسال نظر آزاد است، اما اگر قبلا در بیان ثبت نام کرده اید می توانید ابتدا وارد شوید.
شما میتوانید از این تگهای html استفاده کنید:
<b> یا <strong>، <em> یا <i>، <u>، <strike> یا <s>، <sup>، <sub>، <blockquote>، <code>، <pre>، <hr>، <br>، <p>، <a href="" title="">، <span style="">، <div align="">
تجدید کد امنیتی