Tampilkan postingan dengan label AJAX. Tampilkan semua postingan
Tampilkan postingan dengan label AJAX. Tampilkan semua postingan
Posted on 11.47

HTML 5 Server Sent Event



Sebelum melanjutkan pembahasan tentang reverse AJAX yang masi bersambung kemarin, kita pindah dulu sebentar ke sesuatu yang masih nyambung dengan reverse AJAX yaitu ke salah satu fitur di HTML 5 yang memungkinkan website kita dapat berinteraksi secara realtime. Fitur tersebut disebut dengan Server Sent Event (SSE).

SSE adalah API yang disediakan oleh HTML 5 untuk mem-push data dari server ke client. Dengan menggunakan SSE kita dapat mendapatkan update dari server tanpa harus mengirimkan data tertentu terlebih dahulu. Contoh implementasinya bisa berupa live notification, atau realtime timeline update, atau untuk untuk sistem penjualan bisa berupa realtime stock monitoring. Kelebihan SSE dibandingkan dengan web socket ataupun comet addalah, penggunaan SSE ini tidak memerlukan fitur tambahan pada server. Jadi kalaupun nantinya aplikasi kita dijalankan di shared hosting kita tetap bisa menggunakan fitur SSE ini.
html5-sse
Javascript API

Untuk bisa memperoleh event stream buat object EventSource dan arahkan ke URL Stream, seperti contoh berikut:

var source=new EventSource("path_to_event_file");

Kemudian untuk memperoleh message dari server kita panggil event onmessage dan memberikan handler apa yang akan kita lakukan terhadap message tersebut, seperti contoh berikut:

source.onmessage=function(event){

 /*event handler*/
};

Beberapa atribut yang terdapat pada SSE yaitu:
  • new EventSource(URL) à digunakan untuk membuat object EventSource yang akan menerima event dari URL yang dispesifikasikan
  • readyState à untuk mengetahui status EventSource apakah connecting, open, atau close
  • onopen, onmessage à event yang dapat dikirimkan oleh EventSource
  • event.dataà Konten dari message yang dikirimkan
  • close à menutup koneksi dari client side
Property pada Server Sent Event

Server Sent Event memiliki beberapa fitur khusus yaitu:
  • Stream koneksi dari server sifatnya read only.
  • Menggunakan HTTP request biasa dan tidak membutuhkan protocol khusus.
  • Jika koneksi terputus, EventSource akan mengirimkan event error kemudian mencoba mengkoneksikan kembali. Server juga akan mengelola timeout sebelum klien mencoba untuk mengkoneksikan kembali.
  • Klien dapat mengirimkan ID unik di dalam pesan yang dikirimkan. Ketika klien mencoba untuk reconnect setelah koneksi terputus, server akan mengirimkan ID yang paling terakhir terkirim.
Event Stream Format

Untuk bisa mengirimkan data dari server maka harus mengawali dengan perintah ‘data:’ diikuti dengan pesan yang akan dikirimkan. Seperti contoh berikut:

data: My message\n\n

Jika pesan terdiri lebih dari satu baris, maka dapat dituliskan sebagai berikut:

data: first line\n
data: second line\n\n

Untuk mengirimkan data berupa JSON:

data: {\n
data: "msg": "hello world",\n
data: "id": 12345\n
data: }\n\n

Client Side untuk menghandle:

source.addEventListener('message', function(e) {
  var data = JSON.parse(e.data);
  console.log(data.id, data.msg);
}, false);

Untuk memberikan nama tertentu dari Event:

data: {"msg": "First message"}\n\n
event: userlogon\n
data: {"username": "John123"}\n\n
event: update\n
data: {"username": "John123", "emotion": "happy"}\n\n

Client side untuk menghandle:

source.addEventListener('message', function(e) {
  var data = JSON.parse(e.data);
  console.log(data.msg);
}, false);

source.addEventListener('userlogon', function(e) {
  var data = JSON.parse(e.data);
  console.log('User login:' + data.username);
}, false);

source.addEventListener('update', function(e) {
  var data = JSON.parse(e.data);
  console.log(data.username + ' is now ' + data.emotion);
}, false);

Contoh Sederhana

Saya akan memberikan sedikit contoh sederhana untuk membuat live notification sistem. Pada contoh berikut, server akan mengirimkan jumlah notifikasi baru setiap ada penambahan data notifikasi belum terbaca pada database.

Langkah pertama kita buat tabel dulu di database bernama tabel notifikasi, dengan struktur sebagai berikut:

Atribut

Tipe Data

Keterangan
idnotifikasi int Auto_INCREMENT
isinotifikasi varchar(100) konten dari notifikasi
status int status notifikasi, 0 jika sudah terbaca, 1 jika belum terbaca


Buat file koneksi ke database dan query yang dibutuhkan:


$hostname="localhost";
$user="root";
$pass="";
$db="nama_db";

$con=mysql_connect($hostname, $user, $pass);
mysql_select_db($db,$con);


function getaktifnotifikasi(){
 require_once('koneksi.php');
 $notif=array();
 $sql="select * from notifikasi where status=1";
 $hasil=mysql_query($sql);
 $jumlah=mysql_num_rows($hasil);
 $i=1;
 if($jumlah > 0){
  while($pel=mysql_fetch_array($hasil)){
   $notif[$i]['idnotifikasi']=$pel['idnotifikasi'];
   $notif[$i]['isinotif']=$pel['isinotif'];
   $notif[$i]['status']=$pel['status'];
   $i++;
  }
 }
 return $notif;
}

Buat file notifikasi.php dengan isi sebagai berikut:

 0){
 echo "data: {$jumlah} \n\n"; /*pesan yang dikirimkan*/
}

flush();
?>

Buat file index.php untuk menampilkan notifikasi:



Data Baru


Jalankan. Coba tambah isi tabel dari database dengan bermacam status dan perhatikan hasilnya.

Setiap isi tabel bertambah maka jumlah notifikasi yang tampil pun akan berubah, begitu juga jika status notifikasi sudah terbaca maka jumlah notifikasi pun akan berkurang. Contoh ini adalah contoh paling sederhana, selamat mencoba… Read More

Posted on 11.45

Intro to AJAX and Reverse AJAX



AJAX atau kepanjangannya Asynchronous Javascript and XML merupakan cara bertukar data dengan server tanpa harus me-reload halaman web. Penggunaan AJAX tidak bisa dilakukan secara berdiri sendiri tetapi digabungkan dengan teknologi yang lain seperti HTML dan CSS. Javascript dan XMLHttpRequest menyediakan metode untuk terjadinya pertukaran data secara asynchronous. Nah pada prinsipnya AJAX ini berfungsi untuk meminta server bisa mengirimkan data tanpa prosesnya diketahui oleh pengguna, jadi simplenya tiba-tiba data sudah disajikan kepada pengguna.

Sudah sangat banyak pembahasan tentang si AJAX ini. Disini yang mau lebih saya bahas adalah sedikit pengenalan untuk Reverse Ajax. Jadi beberapa waktu yang lalu (sekitar akhir tahun 2013), saya membaca sebuah artikel dari IBM yang temanya adalah Streaming and Long Polling for Responsive Communication Between Your Server and Client dan artikel tersebut tertanggal 19 Juli 2011, hehehe telat banget saya taunya. Saya juga kebetulan nemu itu artikel karena saya waktu itu lagi butuh nyekrip  bikin live notification yang kaya punyanya si Facebook. Pertamanya saya pikir notifikasi model gitu itu pakainya AJAX tapi ternyata setelah baca teorinya agak lebih dalam, penggunaan AJAX untuk live notification  ini boros, karena bisa aja ketika client meminta kepada server untuk dikirimkan notifikasi ternyata tidak ada notifikasi baru alias permintaan seperti itu harusnya tidak perlu. Dari situlah akhirnya saya menemukan dan sedikit tahu tentang reverse Ajax.

Konsep dasar dari reverse AJAX adalah kemampuan untuk mengirimkan data secara cepat dari server ke client. Tujuan dari reverse AJAX adalah untuk mengijinkan server bisa segera mengirimkan informasi kepada client, tentunya tanpa harus ada reload halaman ataupun aksi tertentu yang dilakukan oleh pengguna.

Teknik-Teknik Reverse AJAX

HTTP Polling dan JSONP Polling

Polling melibatkan permintaan dari client ke server untuk meminta suatu data. Secara konsep Polling tidak ada bedanya dengan AJAX. Untuk bisa mendapatkan event dari server secepat mungkin maka interval waktu antar polling harus seminimal mungkin. Akibatnya adalah client akan meminta terlalu banyak permintaan dan dari permintaan tersebut tidak semuanya membawa data yang dibutuhkan sehingga boros bandwidth. Gambar berikut bisa dilihat untuk mengilustrasikan Polling:



Advantages
  • Mudah diimplementasikan
  • Tidak butuh resource tambahan pada server
  • Bisa jalan di semua browser
Disadvantages
  • Boros bandwidth
Piggyback

Teknik ini sedikit lebih cerdas dibandingkan dengan polling karena akan menghilangkan permintaan-permintaan tanpa hasil. Tidak ada interval waktu tertentu, permintaan dikirimkan ke server ketika client membutuhkan data dari server. Perbedaan dengan polling ada pada response yang dihasilkan. Pada teknik ini, response dibagi menjadi dua response untuk data yang diminta dan server event. Gambar berikut merupakan ilustrasi untuk teknik piggyback:



Advantages
  • Client dapat mengontrol kapan permintaan dikirim
  • Tidak membutuhkan resource tambahan pada server
Disadvantages
  • Tidak diketahui kapan terdapat event di server akan dikirimkan karena membutuhkan permintaan dari client untuk megirimkan event
Comet

Comet merupakan salah satu model aplikasi web dimana permintaan akan dikirimkan kepada server dan permintaan tersebut akan tetap terjadi dalam waktu yang lama sampai time out atau sampai terjadi server event. Ketika sebuah permintaan selesai dijalankan, permintaan yang lain akan segera dikirimkan dan menunggu adanya server event lagi, begitu seterusnya.

Keuntungan dari comet adalah setiap client selalu memiliki sambungan yang terbuka ke server. Server dapat mem-push event sesegera mungkin setiap ada event terjadi. Karena itu, untuk bisa menggunakan comet dibutuhkan fitur tambahan pada server untuk menghadle permintaan jangka panjang ini. Gambar berikut merupakan ilustrasi Comet:



Terdapat dua jenis implementasi Comet yaitu Streaming mode dan Long Polling.

Streaming Mode

Pada mode ini satu koneksi dibuka. Hanya aka nada satu permintaan yang sifatnya long-lived dan setiap event yang terjadi di server akan dikirimkan melalui koneksi yang sama. Pada client side dibutuhkan langkah untuk membedakan response yang dating dari koneksi yang sama. Terdapat dua cara yang umum digunakan yaitu:
  • Forever iframes
Menggunakan hidden iframe tag yang diletakkan pada halaman dengan atribut src yang merujuk pada servlet path yang mengembalikan event server. Setiap terdapat event yang diterima, servlet menuliskan code javascript baru di dalamnya. Konten pada iframe akan ditambahkan dengan kode ini untuk dieksekusi.
  • Multipart XMLHttpRequest
Matode ini menggunakan AJAX yang dikirimkan dan terus terbuka di server. Setiap terdapat event, multipart response dituliskan melalui koneksi yang sama. Pada server side, harus di set terlebih dahulu multipart request kemudian melakukan suspend koneksi. Setiap terjadi event semua koneksi yang disuspend akan diiterasi kemudian menuliskan data didalamnya.

Long Polling

Long Polling mode dilakukan dengan membuat koneksi yang selalu terbuka dan ketika terjadi event response akan di commit dan koneksi ditutup. Kemudian sesegera mungkin koneksi baru dibuka. Terdapat dua cara mengimplementasikan mode ini, yaitu:
  • Script Tags
Implementasi dilakukan dengan menambahkan script tag pada halaman supaya script tersebut dieksekusi. Server akan melakukan suspend koneksi sampai terdapat event, mengirimkan konten script ke browser, dan membuka script tag yang lain untuk mendapatkan event selanjutnya.
  • XMLHttpRequest Long Polling
Implementasi dilakukan dengan membuka permintaan AJAX ke server dan menunggu response. Dibutuhkan fitur khusus pada server untuk mengijinkan permintaan untuk dapat di suspend. Segera setelah terjadi event server mengirimkan response dan menutup koneksi. Client kemudian menerima response dan membuka kembali permintaan AJAX ke server.

WebSocket

Pembahasan websocket bersambung suatu hari nanti ya, begitu juga dengan beberapa contoh implementasinya… Read More