Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
discussions, stats, and author profiles for this publication at: https://www.researchgate.net/publication/274780035
CITATIONS
READS
205
1 author:
M Reza Faisal
Universitas Lambung Mangkurat
19 PUBLICATIONS 0 CITATIONS
SEE PROFILE
Kata Pengantar
Puji dan syukur diucapkan kepada Allah SWT atas selesainya ebook sederhana yang berjudul
Pengenalan ASP.NET SignalR.
Pada ebook ini memberikan pengenalan kepada developer tentang pemrograman real-time
dengan memanfaatkan ASP.NET SignalR 2. Ebook ini terdiri atas empat kelompok, kelompok
pertama berupa pendahuluan yang berisi teknologi yang bisa dimanfaatkan untuk membuat
aplikasi real-time. Setelah itu diperkenalkan ASP.NET SignalR. Pada kelompok kedua dibahas
tentang dua model komunikasi pada ASP.NET SignalR yaitu Hub dan Persistent Connection.
Pada kelompok ini akan diberikan contoh-contoh yang dapat diikuti pembaca agar lebih
mengerti tentang kedua model komunikasi ini. Kelompok ketiga adalah pembahasan untuk
memperlihatkan kepada pembaca bahwa ASP.NET SignalR tidak hanya dapat digunakan
untuk membuat aplikasi web real-time tetapi juga dapat dimanfaatkan untuk platform .NET
yang lain seperti aplikasi Windows Forms, Windows Store dan Windows Phone. Kelompok
yang keempat menjelaskan tentang hosting dan scaleout dengan memanfaatkan Service Bus.
Akhir kata, selamat membaca dan semoga ebook ini bermanfaat bagi para developer untuk
membuat aplikasi real-time. Kritik dan saran akan sangat berarti dan dapat ditujukan via
email.
Erick Kurniawan
M Reza Faisal
(erick@actual-training.com)
(reza.faisal@gmail)
Daftar Isi
Kata Pengantar ............................................................................................... i
Daftar Isi ......................................................................................................... ii
Daftar Gambar ............................................................................................... v
Daftar Kode Program ................................................................................ viii
Daftar Tabel................................................................................................... xi
1 Pendahuluan .................................................................................................1
Socket .................................................................................................................. 1
Multicast ............................................................................................................. 6
Aplikasi Web ..................................................................................................... 9
WebSocket ........................................................................................................ 10
ASP.NET SignalR ............................................................................................ 10
SignalR dan WebSocket..........................................................................................12
Transport dan Fallback ..........................................................................................12
Model Komunikasi .................................................................................................13
Platform ....................................................................................................................13
Referensi ........................................................................................................... 15
2 Lingkungan Pengembangan......................................................................16
3 Hub ...............................................................................................................17
Hello World ...................................................................................................... 17
Membuat Project .....................................................................................................17
Menulis Kode Program ..........................................................................................22
Uji Coba ....................................................................................................................24
Penjelasan .................................................................................................................26
TimerHub ......................................................................................................... 32
Menulis Kode Program ..........................................................................................32
Uji Coba ....................................................................................................................33
Penjelasan .................................................................................................................33
Referensi ........................................................................................................... 34
ii
Referensi ........................................................................................................... 42
Referensi ........................................................................................................... 92
iv
Daftar Gambar
Gambar 1. Program proses listener/server dijalankan pertama kali. ............................................. 5
Gambar 2. Program proses sender/client. .......................................................................................... 5
Gambar 3. Proses listener/server menerima pesan dari proses sender/client. .............................. 6
Gambar 4. Uji coba komunikasi multicast. ........................................................................................ 8
Gambar 5. Hasil uji coba komunikasi multicast. ............................................................................... 8
Gambar 6. Komunikasi pada HTTP. ................................................................................................... 9
Gambar 7. Web service. ........................................................................................................................ 9
Gambar 8. Memanggil method pada client dari server.................................................................. 11
Gambar 9. Memanggil method pada server dari client.................................................................. 12
Gambar 10. Diagram arsitektur SignalR. .......................................................................................... 13
Gambar 11. Solution ASP.NET.SignalR.2. ........................................................................................ 17
Gambar 12. Window Add New Project. ........................................................................................... 17
Gambar 13. Window New ASP.NET Project. .................................................................................. 18
Gambar 14. Project web HelloSignalR. ............................................................................................. 18
Gambar 15. Menambah SignalR Hub Class (v2). ............................................................................ 19
Gambar 16. Class HelloHub.cs. ......................................................................................................... 19
Gambar 17. File-file Javascript. .......................................................................................................... 20
Gambar 18. Namespace untuk mendukung implementasi SignalR............................................. 20
Gambar 19. Menambahkan class OWIN Startup. ........................................................................... 21
Gambar 20. Menambahkan file index.html...................................................................................... 22
Gambar 21. Membuat file index.html sebagai start page. .............................................................. 23
Gambar 22. HelloWorld di Internet Explorer. ................................................................................. 24
Gambar 23. Uji coba dengan 4 window web browser. ................................................................... 25
Gambar 24. Pengujian pengiriman pesan ke seluruh client. ......................................................... 25
Gambar 25. Daftar method event handler........................................................................................ 27
Gambar 26. Prompt nama user. ......................................................................................................... 29
Gambar 27. Alert untuk memberi informasi user baru bergabung pada chatroom. ................. 30
Gambar 28. Uji coba chatroom. .......................................................................................................... 31
Gambar 29. Uji coba timer.html. ........................................................................................................ 33
Gambar 30. Uji coba implementasi Persistent Connection. ........................................................... 37
Gambar 31. Input nama user. ............................................................................................................. 41
Gambar 32. Chat room. ....................................................................................................................... 41
vii
viii
Kode Program 33. Class OWIN Startup pada Persistent Startup.cs. ......................................... 35
Kode Program 34. Persistent index.html. ...................................................................................... 36
Kode Program 35. Konfigurasi Hub pada OWIN Startup class. ................................................... 37
Kode Program 36. Konfigurasi Persistent Connection pada OWIN Startup class. .................... 37
Kode Program 37. Koneksi client ke server. .................................................................................... 37
Kode Program 38. Persistent Connection Server OnConnected. ............................................ 38
Kode Program 39. Persistent Connection Client received. ...................................................... 38
Kode Program 40. Persistent Connection Client tombol diklik. ............................................. 38
Kode Program 41. Persistent Connection Server OnReceived. ............................................... 38
Kode Program 42. Persistent Connection Class (v2) ChatRoom.cs. .......................................... 39
Kode Program 43. Path koneksi untuk class ChatRoom. ............................................................... 39
Kode Program 44. OWIN Startup class pada persistent Startup.cs. .......................................... 40
Kode Program 45. Persistent chatroom.html. ............................................................................... 40
Kode Program 46. ClientWinForms Form1.cs. ............................................................................. 46
Kode Program 47. Namespace Microsoft.AspNet.SignalR.Client. ............................................... 48
Kode Program 48. Instansiasi class dan interface. .......................................................................... 48
Kode Program 49. Koneksi ke Hub server. ...................................................................................... 49
Kode Program 50. Register method. ................................................................................................. 49
Kode Program 51. Method pada Hub sisi server. ........................................................................... 49
Kode Program 52. Method pada sisi client. ..................................................................................... 49
Kode Program 53. Register method dan data. ................................................................................. 49
Kode Program 54. Register method Show. ...................................................................................... 49
Kode Program 55. Method Show. ..................................................................................................... 49
Kode Program 56. ClientWinForms Form1.cs yang telah diupdate. ......................................... 50
Kode Program 57. MainPage.xaml. ................................................................................................... 55
Kode Program 58. MainPage.xaml.cs. .............................................................................................. 56
Kode Program 59. Koneksi ke Hub sisi server. ............................................................................... 58
Kode Program 60. Mendaftarkan method client dan memulai proses koneksi ke Hub server.
........................................................................................................................................................ 58
Kode Program 61. Method client Connected. ............................................................................... 58
Kode Program 62. Method client Show. ........................................................................................ 59
Kode Program 63. Method client Connected yang salah. ........................................................... 59
Kode Program 64. Baris jQuery.support sebelum diubah. ............................................................ 62
Kode Program 65. Baris jQuery.support setelah diubah. ............................................................... 63
Kode Program 66. default.html ......................................................................................................... 63
ix
Daftar Tabel
Tabel 1. Kebutuhan transport web browser..................................................................................... 14
Tabel 2. Kebutuhan transport pada Windows Dekstop dan Silverlight. ..................................... 15
Tabel 3. Kebutuhan transport pada Windows Store dan Windows Phone. ................................ 15
xi
Pendahuluan
Socket
Salah satu cara komunikasi antar proses-proses pada jaringan komputer adalah dengan
memanfaatkan socket. Komunikasi dengan memanfaatkan socket dapat menggunakan
transmisi TCP ataupun UDP. Jika menggunakan transmisi TCP maka istilah datanya biasa
dikenal sebagai stream, sedangkan jika menggukan transmisi UDP maka istilah datanya
dikenal sebagai datagram. Untuk lebih mendapatkan pengetahuan yang lebih jauh tentang
TCP, UDP, stream dan datagram maka pembaca dianjurkan untuk membaca materi-materi
tentang Jaringan Komputer atau Sistem Tersebar.
Cara komunikasi ini adalah dengan membuat socket pada proses yang diinginkan. Informasi
yang diperlukan untuk melakukan komunikasi via socket adalah IP address dan port yang
digunakan.
Sebagai contoh, jika ada dua komputer yang terkoneksi pada jaringan komputer. Maka pada
pada setiap komputer tersebut dapat dibuat proses untuk saling berkomunikasi yang artinya
diperlukan socket pada setiap proses tersebut yang secara sederhana dapat digambarkan
seperti berikut.
Pada gambar di atas, dicontohkan pada proses sender mempunyai fungsi untuk mengirimkan
pesan lewat jaringan komputer. Sedangkan pada proses listener akan berfungsi untuk
menerima pesan dari sender dan begitu pesan diterima proses ini akan memberikan balasan
kepada proses sender.
Berikut ini adalah contoh kode program implementasi dari ilustrasi di atas. Berikut ini adalah
kode program yang dapaat digunakan untuk proses sender.
System;
System.Collections.Generic;
System.Linq;
System.Text;
System.Threading.Tasks;
System.Net;
using System.Net.Sockets;
using System.Text;
namespace SynchronousClient
{
class Program
{
public static void StartChat(string message)
{
// Data buffer untuk data masuk.
byte[] bytes = new byte[1024];
// melakukan koneksi remote ke server.
try
{
// menentukan endpoint remote untuk socket.
// contoh digunakan port 11000.
IPHostEntry ipHostInfo = Dns.Resolve(Dns.GetHostName());
IPAddress ipAddress = ipHostInfo.AddressList[0];
IPEndPoint remoteEP = new IPEndPoint(ipAddress, 11000);
// membuat socket TCP/IP.
Socket sender = new Socket(AddressFamily.InterNetwork,
SocketType.Stream, ProtocolType.Tcp);
// melakukan koneksi ke socket remote endpoint.
// penanganan jika error.
try
{
sender.Connect(remoteEP);
Console.WriteLine("Socket connected to {0}",
sender.RemoteEndPoint.ToString());
// encode data string menjadi byte array.
byte[] msg = Encoding.ASCII.GetBytes(message + "<EOF>");
// mengirim data via socket.
int bytesSent = sender.Send(msg);
// menerima respon dari server.
int bytesRec = sender.Receive(bytes);
Console.WriteLine("Terkirim pada {0}",
Encoding.ASCII.GetString(bytes, 0, bytesRec));
Console.WriteLine("Konfirmasi diterima pada " +
DateTime.Now.ToString());
Console.WriteLine();
// release socket.
sender.Shutdown(SocketShutdown.Both);
sender.Close();
}
catch (ArgumentNullException ane)
{
Console.WriteLine("ArgumentNullException : {0}",
ane.ToString());
}
catch (SocketException se)
{
Console.WriteLine("SocketException : {0}",
se.ToString());
}
catch (Exception e)
{
Console.WriteLine("Unexpected exception : {0}",
e.ToString());
}
}
catch (Exception e)
{
Console.WriteLine(e.ToString());
}
}
System;
System.Collections.Generic;
System.Linq;
System.Text;
System.Threading.Tasks;
System.Net;
System.Net.Sockets;
namespace SynchronousServer
{
class Program
{
// data masuk dari client.
public static string data = null;
public static void StartListening()
{
// data buffer untuk data masuk.
Console.WriteLine(e.ToString());
}
Console.WriteLine("\nPress ENTER to continue...");
Console.Read();
}
static int Main(string[] args)
{
StartListening();
return 0;
}
}
}
Untuk memperlihatkan bagaimana kedua program di atas melakukan pengiriman pesan via
socket maka dapat dijalankan proses listener/server terlebih dahulu, maka dapat dilihat
tampilan seperti berikut ini.
Pada gambar 2 dapat dilihat pesan dikirimkan dan mendapat respon dari proses listener.
Sedangkan pada proses listener dapat dilihat bagaimana pesan diterima, seperti pada gambar
di bawah ini.
Multicast
Komunikasi multicast memungkinkan sebuah pesan dikirimkan dari sebuah proses
dikirimkan kepada setiap anggota dari sebuah kelompok proses. Atau mengirimkan sebuah
informasi kepada banyak penerima secara sekaligus dan sering dikenal dengan istilah
broadcast. Sebagai contoh adalah mengirimkan pesan dari 1 komputer ke seluruh komputer
yang berada dalam 1 jaringan.
Untuk melihat cara kerja komunikasi multicast dapat dengan mencoba kode program berikut
ini. Seperti halnya pembahasan komunikasi socket di atas, komunikasi ini juga masih
memanfaatkan socket dan contoh ini terdiri atas dua program yaitu listener dan sender.
Berikut ini adalah kode program listener.
System;
System.Collections.Generic;
System.Linq;
System.Net;
System.Net.Sockets;
System.Text;
System.Threading.Tasks;
namespace MulticastListener
{
class Program
{
static void Main(string[] args)
{
UdpClient client = new UdpClient();
client.ExclusiveAddressUse = false;
IPEndPoint localEp = new IPEndPoint(IPAddress.Any, 2222);
client.Client.SetSocketOption(SocketOptionLevel.Socket,
SocketOptionName.ReuseAddress, true);
client.ExclusiveAddressUse = false;
client.Client.Bind(localEp);
IPAddress multicastaddress = IPAddress.Parse("239.0.0.222");
client.JoinMulticastGroup(multicastaddress);
Console.WriteLine("Listening this will never quit so you will
need to ctrl-c it");
while (true)
{
Byte[] data = client.Receive(ref localEp);
string strData = Encoding.Unicode.GetString(data);
Console.WriteLine(strData);
}
}
}
}
System;
System.Collections.Generic;
System.Linq;
System.Net;
System.Net.Sockets;
System.Text;
System.Threading.Tasks;
namespace MulticastSender
{
class Program
{
static void Main(string[] args)
{
UdpClient udpclient = new UdpClient();
IPAddress multicastaddress = IPAddress.Parse("239.0.0.222");
udpclient.JoinMulticastGroup(multicastaddress);
IPEndPoint remoteep = new IPEndPoint(multicastaddress, 2222);
Byte[] buffer = null;
Console.WriteLine("Press ENTER to start sending messages");
Console.ReadLine();
for (int i = 0; i <= 8000; i++)
{
buffer = Encoding.Unicode.GetBytes(i.ToString());
udpclient.Send(buffer, buffer.Length, remoteep);
Console.WriteLine("Sent " + i);
}
Console.WriteLine("All Done! Press ENTER to quit.");
Console.ReadLine();
}
}
}
Pada gambar di bawah ini merupakan uji coba komunikasi multicast, dimana window pada
sisi kiri adalah program sender yang akan mengirimkan sebuah pesan ke beberapa program
listener (pada sisi kanan) sekaligus.
Jenis komunikasi multicast dapat dimanfaatkan untuk banyak keperluan, diantaranya adalah
dapat dimanfaatkan untuk mengiriman notifikasi atau alert ke banyak proses yang berada
dalam satu kelompok.
Aplikasi Web
Komunikasi aplikasi web menggunakan protokol HTTP. Pada aplikasi web terdapat server
yang dikenal dengan istilah web server dan client yang akan mengakses halaman atau
layanan web tersebut disebut client. Salah satu program client yang sering digunakan adalah
web browser. Cara komunikasi yang dilakukan adalah request dan respond seperti pada
gambar di bawah ini.
Seperti halnya pada saat mengakes halaman web, saat mengakses web service pun tetap
menggunakan cara request dan respond. Yang membedakan dari halaman web adalah data
yang didapat hasil respond ini adalah berupa data XML.
Dengan cara komunikasi request-respond ini maka perubahan data pada client hanya bisa
terjadi jika client melakukan permintaan pembaharuan data ke server. Jadi tidak
dimungkinkan jika server mengirimkan data ke client tanpa permintaan. Sehingga tidak
dimungkinkan membuat aplikasi chatting secara real-time jika hanya memanfaatkan standar
komunikasi HTTP saja.
WebSocket
Dari paparan di atas, diketahui jika komunikasi HTTP mempunyai keterbatasan jika
dibandingkan komunikasi via socket yang sebelumnya telah dibahas. Tetapi keduanya
mempunyai persamaan yaitu ada yang berperan sebagai client dan yang lainnya berperan
sebagai server. Keduanya sama-sama berkomunikasi pada jaringan tetapi pada proses client
dan server pada aplikasi web tidak memiliki socket. Jadi jika aplikasi web ingin
berkomunikasi seperti layaknya komunikasi socket yang telah dibahas di atas maka pada
proses client dan server perlu ditambahkan socket.
Adalah web socket protokol yang memungkinkan hal itu bisa dilakukan. Web socket
merupakan protokol yang menyediakan kanal komunikasi full-duplex dengan menggunakan
sebuah koneksi TCP. Seperti halnya socket yang memerlukan IP address dan port untuk
saling berkomunikasi, maka web socket pun memerlukan kedua hal itu. Tetapi karena
digunakan jalur HTTP artinya port yang digunakan adalah port 80. Hal ini merupakan
keuntungan tersendiri karena port tersebut umum digunakan, sehingga tidak akan
mempunyai masalah dengan kebijakan firewall.
Saat ini web socket sudah didukung dan dapat digunakan pada web browser seperti Internet
Explorer, Google Chrome, Firefox, Safari dan Opera. Selain itu web socket tidak hanya dapat
digunakan pada pada web browser dan web server saja, tetapi dapat digunakan pada aplikasi
client atau server yang lain. Hal ini berarti komunikasi socket ke web server dapat dilakukan
oleh aplikasi Web, Win Forms, Windows Phone, Windows Store dan lain-lain.
ASP.NET SignalR
Jika kita perhatikan cara melakukan koneksi pada contoh program yang dibahas pada bagian
Socket dan Multicast terlihat sangat mudah dan singkat.
Sebagai contoh untuk membuat socket yang menggunakan transmisi TCP cukup dengan cara
seperti berikut ini.
Atau untuk membuat komunikasi multicast cukup dengan cara berikut ini.
10
Kemudahan penulisan kode di atas dikarenakan hal itu sudah ditangani oleh .NET
Framework dengan cara memanfaatkan namespace System.Net dan System.Net.Socket.
Sehingga developer yang menggunakan namespace tersebut dapat langsung menggunakan
class-class untuk komunikasi menggunakan socket.
ASP.NET SignalR atau dapat disingkat menjadi SignalR adalah library seperti halnya
namespace di atas yang bertujuan untuk mempermudahkan kerja developer. SignalR adalah
library yang dpat digunakan oleh developer ASP.NET untuk memudahkan membuat proses
fungsi web real-time pada aplikasi yang dibuat. Fungsi web real-time adalah kemampuan
untuk membuat kode server melakukan pengiriman (push) konten atau data kepada client
yang sudah terkoneksi ke server, sehingga server tidak perlu menunggu client untuk
melakukan permintaan (request) data baru.
Fungsional real-time pada aplikasi web ASP.NET dengan menggunakan SignalR dapat
digunakan untuk membuat aplikasi chat yang sesungguhnya. Bukan hanya itu saja developer
dapat melakukan banyak hal lainnya sebagai contoh untuk membuat dashboard dan aplikasi
monitoring, aplikasi kolaborasi yang berfungsi untuk melakukan edit dokumen secara
simultan oleh banyak user, update kemajuan pekerjaan dan real-time form. SignalR juga
dapat digunakan untuk aplikasi web yang memerlukan update dengan frekuensi tinggi dari
server seperti real-time game, berikut ini adalah contoh real-time game yang dibangun
dengan SignalR yaitu http://shootr.signalr.net/.
SignalR menyediakan API yang mudah untuk membuat server-to-client remote procedure
call (RPC) yang memanggil fungsi-fungsi Javascript pada client browser dan platform client
lainnya dari kode server-side. Ini artinya fungsi kode pada server diijinkan untuk memanggil
fungsi kode pada client. SignalR juga menyediakan API untuk mengelola koneksi seperti
untuk event connect dan disconnect, selain itu juga menyediakan untuk koneksi group.
Pada gambar di bawah ini menjelaskan komunikasi antara client dan server dengan
memanfaatkan SignalR.
11
2.
Transport HTML 5.
Pada jenis transport ini terdapat dua transport yang dapat digunakan yaitu :
- WebSocket, transport ini telah didukung oleh versi terbaru dari Internet Explorer,
Google Chrome, Mozilla Firefox dan pada web browser Safari dan Opera hanya
sebagian implementasi saja yang dilakukan. Artinya tidak seluruh kemampuan
dari transport WebSocket didukung pada Safar dan Operai.
- Server Sent Events juga dikenal dengan istilah EventSource telah didukung oleh
seluruh web browser kecuali Internet Explorer.
Transport Coment.
12
Berikut ini aalah transport yang digunakan pada jenis ini, yaitu :
- Forever Frame, transport ini hanya dapat digunakan pada Internet Explorer.
- Ajax long polling.
Model Komunikasi
Model komunikasi yang digunakan pada SignalR API adalah :
1.
2.
Persistent Connection.
Persistent Connection API memungkinkan developer untuk mengakses secara
langsung protokol komunikasi low level.
Hub.
Model ini adalah high-level pipeline. Cara kerja model ini, ketika kode server-side
memamnggil method pada client, sebuah paket dikirim lewat tranport yang aktif.
Paket ini berisi nama dan parameter method tersebut dengan format JSON. Ketika
client berhasil mencocokkan nama method tersebut dengan yang ada di client maka
client akan mengeksekusi method tersebut dengan menggunakan nilai parameter
yang telah dideselisasi.
Platform
Pada bagian ini akan diinformasikan platform yang mendukung ASP.NET SignalR.
Kebutuhan Server
Sistem operasi server yang dapat digunakan adalah :
1.
2.
3.
4.
5.
Windows 8.
Windows 7.
Windows Azure.
Versi .NET Framework yang mendukung SignalR 2 adalah .NET Framework 4.5.
Web server yang dapat digunakan adalah :
1.
2.
3.
4.
Kebutuhan Client
Web browser yang menggunakan SignalR setidaknya dapat menggunakan jQuery 1.6.4 atau
versi major diatasnya seperti versi 1.7.2, versi 1.8.2 atau versi 1.9.1.
Web browser yang dapat digunakan adalah :
1.
2.
3.
4.
5.
6.
Microsoft Internet Explorer versi 8, 9, 10 dan 11. Mendukung versi modern, desktop,
dan mobile.
Mozilla Firefox: versi sekarang - 1, versi Windows dan Mac.
Google Chrome: versi sekarang - 1, versi Windows dan Mac.
Safari: versi sekarang - 1, versi Mac dan iOS.
Opera: versi sekarang - 1, hanya untuk versi Windows.
Android browser.
14
Referensi
http://www.asp.net/signalr/overview/getting-started/introduction-to-signalr
http://www.asp.net/signalr/overview/getting-started/supported-platforms
15
Lingkungan Pengembangan
Seperti yang telah disebutkan pada bagian sebelumnya bahwa lingkungan pengembangan
ASP.NET SignalR yang diajurkan adalah menggunakan Windows 2012 atau Windows 8 dan
.NET Framework 4.5.
Berikut ini adalah lingkungan pengembangan yang digunakan untuk menulis ebook ini :
1.
2.
3.
4.
16
Hub
Pada bagian berikut ini akan dipaparkan tahap-tahap implementasi ASP.NET SignalR 2 pada
aplikasi web dengan menggunakan model komunikasi Hub.
Hello World
Membuat Project
Langkah pertama yang dilakukan adalah membuat solution. Pada ebook ini dibuat solution
dengan nama ASP.NET.SignalR.2.
17
Nama project ini adalah HelloSignalR yang dapat ditulis pada kolom Name, kemudian klik
tombol OK. Pada window New ASP.NET Project pilih Empty kemudian klik tombol OK.
18
System;
System.Collections.Generic;
System.Linq;
System.Web;
Microsoft.AspNet.SignalR;
namespace HelloSignalR
{
public class HelloWorld : Hub
{
19
Selain menambahkan file class tersebut juga ditambahkan folder Scripts yang berisi file-file
kode Javascript yang dapat dilihat pada gambar di bawah ini.
20
1.
2.
3.
4.
5.
6.
Microsoft.AspNet.SignalR.Core.
Microsoft.AspNet.SignalR.SystemWeb.
Microsoft.Owin.
Microsoft.Owin.Host.SystemWeb.
Microsoft.Owin.Security.
Owin.
Selanjutnya adalah menambahkan class OWIN Startup dengan cara klik kanan pada project
kemudian pilih Add > New Item. Kemudian pilih Web dan pilih OWIN Startup class. Pada
kolom Name isi dengan nilai Startup.cs. Kemudian klik tombol Add.
System;
System.Threading.Tasks;
Microsoft.Owin;
Owin;
[assembly: OwinStartup(typeof(HelloSignalR.Startup))]
namespace HelloSignalR
{
public class Startup
{
public void Configuration(IAppBuilder app)
{
// For more information on how to configure your application,
visit http://go.microsoft.com/fwlink/?LinkID=316888
}
}
}
21
Kode Program 10. Class OWIN Startup pada Hub Startup.cs - modifikasi.
using
using
using
using
System;
System.Threading.Tasks;
Microsoft.Owin;
Owin;
[assembly: OwinStartup(typeof(HelloSignalR.Startup))]
namespace HelloSignalR
{
public class Startup
{
public void Configuration(IAppBuilder app)
{
app.MapSignalR();
}
}
}
22
23
</html>
Uji Coba
Setelah melakukan pembuatan kode di atas maka selanjutnya aplikasi web yang telah ditulis
di atas diuji coba. Untuk menguji aplikasi di atas akan digunakan beberapa window web
browser yang akan dijalan sekaligus. Pada uji coba ini akan digunakan dua jenis web browser
yaitu Internet Explorer dan Mozilla Firefox.
Langkah pertama yang dilakukan untuk uji coba ini adalah mengeksekusi project ini dengan
cara klik kanan pada project kemudian pilih Debug > Start new instance. Maka akan dapat
dilihat web browser Internet Explorer seperti berikut ini.
24
25
Penjelasan
Pada contoh di atas digunakan model komunikasi Hub. Oleh sebab itu pada project
ditambahkan class Hub dengan nama HelloWorld. Karakteristik high level dari Hub
membuat developer sangat dimudahkan. Terbukti pada pada contoh di atas tidak perlu
menulis baris kode yang rumit.
Seperti halnya penjelasan pada komunikasi socket di bagian sebelumnya dimana komunikasi
bisa terjadi dikarenakan pada proses listener dan proses sender terdapat sesuatu yang
dapat membuat kedua proses tersebut berkomunikasi secara aktif. Sesuatu yang dimaksud
itu adalah socket. Pada contoh di atas dapat dilihat ada sesuatu yang ditambahkan pada
sisi server dan sisi client. Sesuatu yang ditambahkan pada sisi server adalah dengan
menambahkan class Hub dengan nama file HelloWorld.cs yang diikuti dengan penambahan
beberapa namespace yang berfungsi untuk mendukung Hub. Sedangkan pada sisi client
dapat dilihat penambahan file-file pada folder Scripts yang berisi file Javascript yang
merupakan library jQuery dan SignalR yang berfungsi untuk membuat sesuatu pada sisi
client.
Ada beberapa hal yang perlu diperhatikan pada kode-kode program yang telah ditulis diatas
agar mengerti bagaimana cara kerja baris kode yang telah ditulis.
Pada kode program 8 di atas dapat dilihat kode dari class Hub dengan nama HelloWorld
yang didalamnya terdapat method dengan nama Hello dengan isi sebagai berikut :
Kode Program 12. SignalR Hub Class (v2) HelloWorld Method Hello.
public void Hello()
{
Clients.All.hello();
}
Dapat dilihat isi dari method Hello tersebut berfungsi untuk memanggil fungsi hello yang
berada pada kode sisi client yang terkoneksi pada server.
Sedangkan pada sisi client ada beberapa hal yang mesti diperhatikan untuk implementasi
SignalR. Hal yang pertama dilakukan adalah menambahkan library pendukung SignalR pada
client dengan cara menambahkan baris berikut ini.
Secara otomatis saat halaman ini diakses maka sisi server akan menyiapkan script-script
lainnya sehingga ditulis baris berikut ini untuk mengakses script tersebut.
Selanjutnya adalah membuat koneksi antara client dengan hub pada sisi server yang dapat
dilihat pada baris berikut ini.
Dari kode di atas dapat dilihat helloWorld mengacu kepada nama class Hub HelloWorld.
Baris penting lainnya pada sisi client adalah baris berikut ini.
26
$('#SubmitButton').click(function () {
hub.server.hello();
});
});
Baris di atas akan dieksekusi saat tombol diklik dan akan mengeksekusi baris
hub.server.hello() yang artinya akan memanggil method Hello yang ada pada clas Hub
HelloWorld. Seperti yang dapat dilihat pada kode program 12 bahwa method Hello akan
memanggil fungsi hello yang ada di sisi client, berikut adalah fungsi hello yang ada di sisi
client.
hub.client.hello = function () {
$('#AddText').append('Hello World!<br />');
}
Fungsi ini yang memungkinkan tulisah Hello World! ditampilkan dilayar seluruh web
browser yang dapat dilihat pada gambar 24 di atas.
Chat Room
Pada bagian ini akan dibuat aplikasi chat room sederhana dengan memanfaatkan SignalR
Hub Class (v2) yang telah dibuat sebelumnya. Untuk membuat hal tersebut maka perlu
ditambahkan sebuah method pada tersebut. Selain itu juga akan diterangkan beberapa hal
yang dimiliki oleh class SignalR Hub Class (v2).
Dari daftar di atas dapat dilihat ada method yang berfungsi sebagai event handler seperti :
1.
2.
3.
Pada class Hub HelloWorld ini akan ditambahkan override method OnConnected dan
menambahkan method Send sebagai salah satu fungsi pada aplikasi ChatRoom ini.
Berikut ini adalah isi file class Hub HelloWorld yang telah dimodifikasi.
System;
System.Collections.Generic;
System.Linq;
System.Web;
Microsoft.AspNet.SignalR;
System.Threading.Tasks;
namespace HelloSignalR
{
public class HelloWorld : Hub
{
public void Hello()
{
Clients.All.hello();
}
public void Send(string user, string pesan)
{
Clients.All.show(user, pesan);
}
public override Task OnConnected()
{
return Clients.All.connected();
}
}
}
28
$('#SubmitButton').click(function () {
hub.server.send($('#UserChat').val(),
$('#PesanChat').val());
$('#PesanChat').val('').focus();
});
});
});
</script>
</head>
<body>
<div id="ChatUser"></div>
<input type="text" id="PesanChat" />
<input type="button" id="SubmitButton" value="Send" />
<div id="AddText"></div>
<input type="hidden" id="UserChat" />
</body>
</html>
Nilai nama user yang dimasukkan akan disimpan di client yaitu pada elemen dengan ID =
UserChat. Dalam kasus ini nilai tersebut akan disimpan pada elemen input seperti kode di
bawah ini.
Selanjutnya akan dilakukan konesi ke hub di server, dan jika koneksi berhasil dilakukan maka
server akan mengirimkan pesan ke seluruh client untuk memberikan informasi bahwa ada
user baru yang bergabung ke chatroom. Berikut ini adalah kode untuk melakukan koneksi
ke hub di server.
29
Pada server terdapat event handler ketika ada koneksi yang terjadi yang kodenya dapat
dilihat di bawah ini.
Kode Program 22. Event handler ketika ada client yang melakukan koneksi ke
server.
public override Task OnConnected()
{
return Clients.All.connected();
}
Pada method tersebut dapat dilihat akan dilakukan pemanggilan fungsi connected yang ada
pada sisi server dimana fungsi tersebut dapat dilihat di bawah ini.
Hasil dari fungsi tersebut dapat dilihat pada gambar di bawah ini.
Gambar 27. Alert untuk memberi informasi user baru bergabung pada chatroom.
Selanjutnya user dapat mengetikkan pesan dan klik tombol Send untuk mengirim pesan pada
chatroom. Untuk menguji halaman ini digunakan 3 window web browser yaitu 2 window
menggunakan Internet Explorer dan sisanya menggunakan Mozilla Firefox. Setiap window
akan mengetikkan nama user yang berbeda. Maka dapat dilihat seperti pada gambar di
bawah ini hasil pembicaraan 3 orang user pada chat room.
30
Dari kode di atas dapat dilihat baris berikut yang berfungsi untuk memanggil method Send
yang ada di server.
Dapat dilihat kode Send pada sisi server seperti berikut ini :
Isi dari method ini berfungsi untuk memanggil fungsi show yang ada pada setiap halaman
client. Karena halaman ini sedang diakses oleh 3 client maka setiap fungsi show pada setiap
31
client akan dipanggil dan dieksekusi. Berikut ini adalah isi dari fungsi show yang ada di kode
di sisi client.
TimerHub
Pada bagian ini akan diperlihatkan uji coba untuk menambahkan class SignalR Hub Class (v2)
baru pada project ini untuk memperlihatkan bagaimana menangani lebih dari class Hub.
System;
System.Collections.Generic;
System.Linq;
System.Web;
Microsoft.AspNet.SignalR;
System.Threading;
namespace HelloSignalR
{
public class TimerHub : Hub
{
public void Knock()
{
while (true)
{
Thread.Sleep(5000);
string waktu = DateTime.Now.ToString();
Clients.All.doknock(waktu);
}
}
}
}
Jika method Knock dipanggil oleh client maka seperti yang dilihat pada isi dari method
tersebut terjadi pengulangan tanpa henti dimana akan mengirimkan pesan ke semua client
yang terkoneksi ke server setiap 5 detik.
Berikut ini adalah isi dari halaman client yang memanfaatkan class Hub ini.
32
$(document).ready(function () {
var hub = $.connection.timerHub;
hub.client.doknock = function (waktu) {
$('#AddText').append(waktu + ' knock knock <br />');
}
$.connection.hub.start().done(function () {
hub.server.knock();
});
});
</script>
</head>
<body>
<div id="AddText"></div>
</body>
</html>
Dari kode di atas dapat dilihat begitu koneksi berhasil maka client akan memanggil method
Knock di server, kemudian di dalam method Knock di server terlihat ada pemanggilan fungsi
doknock yang ada pada client.
Uji Coba
Di bawah ini dapat dilihat hasil dari halaman timer.html, terlihat pada halaman tersebut
pesan ditampilkan setiap 5 detik.
Penjelasan
Dari uji coba di atas dapat dilihat untuk menambahkan SignalR Hub Class (v2) dapat
dilakukan begitu saja, tanpa harus melakukan penambahan kode apapun di class OWIN
Startup Class. Hal ini nanti akan bisa dibandingkan pada pembahasan saat menggunakan
SignalR Persistent Class (v2) pada bagian selanjutnya.
Hal lain yang perlu diperhatikan adalah cara penulisan class Hub pada client untuk
melakukan koneksi. Pada bagian Hello World dan Chat Room digunakan class Hub dengan
nama HelloWorld sehingga cara penulisan di sisi client adalah sebagai berikut :
33
Sedangkan pada bagian ini digunakan class Hub dengan nama TimerHub maka dapat dilihat
cara penulisan pada client seperti berikut :
Dari kedua contoh tersebut dapat dilihat polanya bahwa huruf awal dari class Hub mesti
ditulis menjadi huruf kecil ketika ditulis pada kode client, selebihnya besar kecil huruf yang
ditulis mengikuti yang ditulis pada class Hub server.
Referensi
http://www.asp.net/signalr/overview/getting-started/tutorial-getting-started-with-signalr
http://www.thinkingcog.com/post/2013/02/23/signalr-sample-application-hello-world.aspx
34
Persistent Connection
Pada bagian berikut ini akan dipaparkan tahap-tahap implementasi ASP.NET SignalR 2 pada
aplikasi web dengan menggunakan model komunikasi Persistent.
Hello World
Membuat Project
Untuk mencoba model komunikasi ini dibuat project dengan nama HelloPersistent dengan
cara yang sama seperti yang telah dilakukan pada bagian sebelumnya. langkah selanjutnya
adalah membuat SignalR Persistent Connection Class (v2) dengan nama HelloWorld. Berikut
adalah kode dari class ini.
System;
System.Collections.Generic;
System.Linq;
System.Threading.Tasks;
System.Web;
Microsoft.AspNet.SignalR;
namespace HelloPersistent
{
public class HelloWorld : PersistentConnection
{
protected override Task OnConnected(IRequest request, string
connectionId)
{
return Connection.Send(connectionId, "Hello World! on " +
DateTime.Now.ToString() + "<br/>");
}
protected override Task OnReceived(IRequest request, string
connectionId, string data)
{
return Connection.Broadcast(data + DateTime.Now.ToString() +
"<br/>");
}
}
}
Selanjutnya membuat OWIN Startup Class dengan nama Startup.cs dengan isi yang telah
dimodifikasi menjadi seperti berikut ini.
System;
System.Threading.Tasks;
Microsoft.Owin;
Owin;
35
[assembly: OwinStartup(typeof(HelloPersistent.Startup))]
namespace HelloPersistent
{
public class Startup
{
public void Configuration(IAppBuilder app)
{
app.MapSignalR<HelloWorld>("/echo");
}
}
}
Uji Coba
Seperti halnya uji coba yang dilakukan pada bahasan Hello World pada bagian Hub
Connection, hasil yang didapat pada kode di atas tidak berbeda jauh. Secara tampilan dapat
dilihat pada gambar di bawah ini.
36
Penjelasan
Jika diperhatikan terdapat beberapa perbedaan jika dibandingkan dengan implmentasi Hub.
Perbedaan pertama adalah pada isi SignalR Persistent Connection Class (v2) dengan nama
HelloWorld. Jika diperhatikan pada class ini semua method yang ditulis adalah hasil dari
override method yang dimiliki oleh class induk. Tidak ada method baru yang dapat ditulis
oleh developer. Berbeda dengan SignalR Hub Class (v2) yang didalamnya dapat
ditambahkan method baru untuk digunakan melakukan komunikasi dengan client. Selain itu
tidak dimungkinkan untuk memanggil method baru tersebut di kode client karena tidak
tersedianya method tersebut, hal ini dikarenakan tidak ada script dinamik berisi method
tersebut yang digenerate oleh server seperti pada implementasi Hub.
Konfigurasi yang dilakukan pada OWIN Startup class juga mengalami perbedaan. Pada
implementasi Hub, konfigurasi yang dilakukan adalah seperti berikut :
Kode Program 36. Konfigurasi Persistent Connection pada OWIN Startup class.
app.MapSignalR<HelloWorld>("/echo");
HelloWorld adalah mengacu kepada class Persistent Connection yang dibuat, sedangkan
/echo merupakan path yang digunakan untuk mengakses class tersebut jika ingin melakukan
koneksi. Sehingga pada kode client dapat dilihat baris berikut untuk melakukan koneksi pada
class Persistent Connection.
37
Setelah client melakukan koneksi ke server maka akan sisi server dapat mengetahui ada client
yang melakuan koneksi dan akan mengeksekusi method event handler berikut ini.
Method itu memungkinkan untuk mengirimkan pesan ke client yang baru melakukan
koneksi dengan connectionId milik client tersebut, yang artinya pesan tidak dikirimkan secara
broadcast ke seluruh client yang terkoneksi. Pada kode di atas dapat dilihat bahwa baris
tersebut tidak memanggil fungsi yang ada di client, kode tersebut menggunakan method Send
yang telah disediakan.
Selanjutnya untuk menerima pesan tersebut pada client terdapat baris kode berikut ini.
Fungsi received ini bertugas untuk menangani apapun yang dikirimkan oleh server. Pada
saat pertama koneksi dilakukan dapat dilihat pesan yang ditampilkan pada baris pertama
pada gambar 30.
Selanjutnya jika tombol Say Hello diklik maka dapat dilihat fungsi seperti berikut :
Seperti halnya cara pengiriman pesan di sisi server yang menggunakan method Send yang
telah disediakan, pada kode di atas dapat dilihat untuk mengirim pesan ke server
menggunakan fungsi send yang juga telah disediakan. Dan untuk menerima pesan yang
dikirimkan oleh client maka di server terdapat event handler berikut ini.
Pada kode di atas dapat dilihat akan dijalankan method Broadcast untuk mengirimkan pesan
ke seluruh client yang terkoneksi dan pesan yang diterima client akan ditangani oleh fungsi
pada kode program 39.
Dari penjelasan ini dapat dilhat baik pada client dan server hanya digunakan fungsi atau
method yang telah disediakan oleh SignalR, tidak ada method tambahan dari developer yang
digunakan pada kode di atas. Seperti yang telah disebutkan pada bagian Model Komunikasi
tentang perbedaan Hub dan Persistent Connection yang menyatakan bahwa Hub merupakan
model komunikasi high level sedangkan Persistent Connection adalah model komunikasi low
38
level. Sehingga pada Persistent Connection tidak terdapat kemudahan seperti yang tersedia
pada Hub.
Chat Room
Pada akan dibuat halaman chat room dengan memanfaatkan Persistent Connection. Terdapat
fitur-fitur yang sedikit berbeda dengan chat room yang telah dibuat sebelumnya pada bagian
Hub.
System;
System.Collections.Generic;
System.Linq;
System.Threading.Tasks;
System.Web;
Microsoft.AspNet.SignalR;
namespace HelloPersistent
{
public class ChatRoom : PersistentConnection
{
protected override Task OnConnected(IRequest request, string
connectionId)
{
return Connection.Send(connectionId, "Selamat datang di chat
room.");
}
protected override Task OnReceived(IRequest request, string
connectionId, string data)
{
return Connection.Broadcast(data);
}
}
}
Agar class tersebut dapat digunakan oleh kode program pada client maka perlu ditambahkan
baris berikut ini pada file Startup.cs.
39
Sehingga secara lengkap isi OWIN Startup class project ini menjadi seperti berikut :
System;
System.Threading.Tasks;
Microsoft.Owin;
Owin;
[assembly: OwinStartup(typeof(HelloPersistent.Startup))]
namespace HelloPersistent
{
public class Startup
{
public void Configuration(IAppBuilder app)
{
app.MapSignalR<HelloWorld>("/echo");
app.MapSignalR<ChatRoom>("/chat");
}
}
}
Sedangkan di kode program untuk sisi client dapat dilihat di bawah ini.
40
Sehingga jika kode client akan melakukan koneksi ke server akan digunakan baris kode
berikut ini :
var persistent = $.connection('/chat');
41
Jika dibandingkan dengan yang pernah dikerjakan pada bagian Hub, dapat dilihat ada
perbedaan dalam menangani pengelolaan class koneksi di sisi server pada OWIN Startup
class. Begitu juga untuk melakukan koneksi dari sisi client ke server terlihat ada perbedaan.
Referensi
https://github.com/SignalR/SignalR/wiki/QuickStart-Persistent-Connections
http://pepitosolis.wordpress.com/2013/11/27/signalr-2-0-persistentconnection-example/
42
Pada bagian ini akan akan dijelaskan bagaimana membuat aplikasi real-time dengan
memanfaatkan model komunikasi Hub pada server dan menggunakan platform Windows
Form sebagai client.
Membuat Project
Tahap pertama yang dilakukan adalah membuat project. Untuk itu klik kanan pada solution
kemudian pilih Add > New Project. Kemudian pilih bahasa yang digunakan C# > Windows
Desktop > Windows Forms Application.
43
44
45
Kemudian akan ditambahkan beberapa kode pada form ini dan kode untuk menangani aksi
ketika tombol Send diklik.
System;
System.Collections.Generic;
System.ComponentModel;
System.Data;
System.Drawing;
System.Linq;
System.Text;
System.Threading.Tasks;
System.Windows.Forms;
using Microsoft.AspNet.SignalR.Client;
namespace ClientWinForms
{
public partial class Form1 : Form
{
HubConnection hubConnection;
IHubProxy hubProxy;
public Form1()
{
InitializeComponent();
hubConnection = new
HubConnection("http://localhost:30526/signalr/hubs");
hubProxy = hubConnection.CreateHubProxy("HelloWorld");
hubProxy.On("connected", Connected);
hubProxy.On<string, string>("show", (user, pesan) =>
MessageBox.Show(user + " : " + pesan));
hubConnection.Start().Wait();
}
private void Connected()
{
MessageBox.Show("User baru bergabung.");
}
private void buttonSend_Click(object sender, EventArgs e)
{
hubProxy.Invoke("Send", "winform user", textBox1.Text).Wait();
}
}
}
Uji Coba
Untuk uji coba dilakukan dengan menjalankan server terlebih dahulu. Kemudian
menjalankan client halaman chatroom.html. Kemudian menjalankan aplikasi client Windows
Forms ini.
46
Begitu pula jika pesan dikirimkan oleh client halaman web, dapat dilihat pesan juga diterima
oleh aplikasi ini.
Penjelasan
Berikut ini adalah penjelasan dari kode program 46. Langkah pertama adalah mendaftarkan
namespace berikut ini.
Dengan kode tersebut maka class-class pada namespace tersebut akan dapat digunakan.
Selanjutnya adalah menyiapkan instan objek dari class-class berikut ini.
Selanjutnya adalah kode berikut ini. Kedua baris di bawah ini berfungsi untuk melakukan
koneksi ke Hub pada sisi server.
48
Baris pertama untuk menentukan alamat dari server SignalR sedangkan baris kedua untuk
menentukan class Hub mana yang akan digunakan.
Pada penjelasan berikut ini adalah bagaimana membuat dan mendaftarkan method atau aksi
pada client agar bisa diakses oleh Hub sisi server. Ada dua cara untuk mendaftarkan method
tersebut. Cara pertama dapat dilihat pada baris berikut ini yang berfungsi untuk
mendaftarkan method.
Parameter pertama dari method On di atas mengacu dari kode Hub sisi server berikut ini.
pada kode di bawah ini dapat dilihat ada pemanggilan method connected yang ada pada
client yang terkoneksi ke server.
Sedangkan parameter kedua dari method On mengacu ke kode yang ada pada client ini.
Cara kedua adalah berfungsi untuk mendaftarkan method dengan cara seperti berikut ini.
Pada baris di atas dapat dilihat pada method On dapat menangani data juga dengan cara
penanganan seperti pada baris di atas. Sama seperti pada cara yang pertama, method On di
sini juga memiliki dua parameter yang mempunyai fungsi sama seperti yang telah dijelaskan
di atas, bedanya hanya pada bagian parameter kedua yang ditulis dengan cara memetakan
data langsung ke suatu method bagian dari framework pada Windows Forms.
Jika cara kedua ini ingin diubah dengan memanfaatkan method yang dibuat sendiri maka
kode di atas dapat diubah menjadi seperti berikut ini.
49
Kode berikut ini merupakan update dari kode sebelumnya dimana pada update ini pesan
akan ditampilkan pada ListBox. Berikut adalah kode yang telah diupdate.
System;
System.Collections.Generic;
System.ComponentModel;
System.Data;
System.Drawing;
System.Linq;
System.Text;
System.Threading.Tasks;
System.Windows.Forms;
using Microsoft.AspNet.SignalR.Client;
namespace ClientWinForms
{
public partial class Form1 : Form
{
HubConnection hubConnection;
IHubProxy hubProxy;
public Form1()
{
InitializeComponent();
hubConnection = new
HubConnection("http://localhost:30526/signalr/hubs");
hubProxy = hubConnection.CreateHubProxy("HelloWorld");
hubProxy.On("connected", Connected);
hubProxy.On<string, string>("show", (user, pesan) => Show(user,
pesan));
hubConnection.Start().Wait();
}
private void Connected()
{
MessageBox.Show("User baru bergabung.");
}
private void Show(string user, string pesan)
{
this.listBoxChat.Invoke(new MethodInvoker(() =>
this.listBoxChat.Items.Add(user + " : " + pesan)));
}
private void buttonSend_Click(object sender, EventArgs e)
{
if (!String.IsNullOrEmpty(textBoxUsername.Text))
{
hubProxy.Invoke("Send", textBoxUsername.Text,
textBoxPesan.Text).Wait();
}
else
{
MessageBox.Show("Username belum diisi.");
}
}
}
}
Referensi
http://www.codeguru.com/columns/experts/how-to-push-data-from-server-to-client-usingsignalr.htm
http://dontcodetired.com/blog/post/Consuming-Server-Side-SignalR-Events-in-UniversalWindows-App-Clients.aspx
51
Pada bagian ini akan akan dijelaskan bagaimana membuat aplikasi real-time dengan
memanfaatkan model komunikasi Hub pada server dan menggunakan platform Windows
Phone sebagai client.
Membuat Project
Untuk menambahkan project dapat dilakukan seperti cara yang sebelumnya telah dilakukan
yaitu klik kanan pada Solution kemudian pilih Add > New Project. Kemudian pilh bahasa
yang digunakan Visual C# > Store Apps > Windows Phone Apps.
52
53
54
55
Click="ApplicationBarIconButton_Send_Click"
IconUri="/Assets2/AppBar/new.png" Text="send"/>
</shell:ApplicationBar>
</phone:PhoneApplicationPage.ApplicationBar>
<!--LayoutRoot is the root grid where all page content is placed-->
<Grid x:Name="LayoutRoot" Background="Transparent">
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<!--TitlePanel contains the name of the application and page title->
<StackPanel x:Name="TitlePanel" Grid.Row="0" Margin="12,17,0,28">
<TextBlock Text="SignalR" Style="{StaticResource
PhoneTextNormalStyle}" Margin="12,0"/>
<TextBlock Text="chat room" Margin="9,-7,0,0"
Style="{StaticResource PhoneTextTitle1Style}"/>
</StackPanel>
<!--ContentPanel - place additional content here-->
<Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="*"/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<ListBox x:Name="ListBox_Chat" Grid.Row="0"/>
<TextBox x:Name="TextBox_Message" Grid.Row="1" />
</Grid>
</Grid>
</Grid>
</phone:PhoneApplicationPage>
System;
System.Collections.Generic;
System.Linq;
System.Net;
System.Windows;
System.Windows.Controls;
System.Windows.Navigation;
Microsoft.Phone.Controls;
Microsoft.Phone.Shell;
ClientWinPhone.Resources;
using Microsoft.AspNet.SignalR.Client;
using System.Threading.Tasks;
namespace ClientWinPhone
{
public partial class MainPage : PhoneApplicationPage
{
HubConnection hubConnection;
56
IHubProxy hubProxy;
// Constructor
public MainPage()
{
InitializeComponent();
hubConnection = new
HubConnection("http://localhost:30526/signalr/hubs");
hubProxy = hubConnection.CreateHubProxy("HelloWorld");
InitializeConnection();
}
private void Connected()
{
this.Dispatcher.BeginInvoke(() => MessageBox.Show("User baru
bergabung."));
}
private async Task Show(string user, string pesan)
{
this.Dispatcher.BeginInvoke(() => ListBox_Chat.Items.Add(user +
" : " + pesan));
}
private async Task InitializeConnection()
{
hubProxy.On("connected", Connected);
hubProxy.On<string, string>("show", (user, pesan) => Show(user,
pesan));
await hubConnection.Start();
}
private void ApplicationBarIconButton_Send_Click(object sender,
EventArgs e)
{
SendMassage("WP User", TextBox_Message.Text);
}
private async Task SendMassage(string user, string pesan)
{
await hubProxy.Invoke("Send", user, pesan);
TextBox_Message.Text = String.Empty;
}
}
}
Uji Coba
Uji coba client ini diuji bersama dengan dua platform client lainnya yaitu web dan Windows
Forms. Dapat dilihat pada gambar di bawah pesan yang dikirimkan salah satu client dapat
ditampilkan pada semua client. Pada uji coba ini terlihat respon pada client Windows Phone
lebih lama waktu tundanya sampai pesan ditampilkan.
57
Penjelasan
Berikut ini adalah penjelasan dari kode yang telah dibuat di atas. Kode program 58 memiliki
kemiripan dengan kode client Windows Forms yang dapat dilihat pada kode program 46.
Untuk melakukan koneksi ke Hub di server dilakukan dengan kode di bawah ini.
Kemudian untuk mendaftarkan method client yang dapat diakses oleh class Hub server dan
memulai proses koneksi maka dipanggil method InitializeConnection yang berisi kode
berikut.
Kode Program 60. Mendaftarkan method client dan memulai proses koneksi ke
Hub server.
private async Task InitializeConnection()
{
hubProxy.On("connected", Connected);
hubProxy.On<string, string>("show", (user, pesan) => Show(user, pesan));
await hubConnection.Start();
}
Pada method di atas dapat dilihat terdapat dua method client yg didaftarkan yaitu Connected
dan Show yang dapat dilihat pada kode berikut ini.
58
Method di atas akan dipanggil Hub sisi server saat ada client yang melakukan koneksi. Dan
kode berikut ini akan dipanggil Hub sisi server untuk menampilkan pesan yang dikirim oleh
client.
Pada Windows Phone, aksi yang melibatkan akses ke control oleh proses lain tidak diijinkan,
sebagai contoh eksekusi yang dilakukan oleh proses Hub di sisi server di atas. Oleh karena
itu jika method Connected berisi seperti kode di bawah ini tidak bisa dilakukan.
Agar aksi yang berhubungan dg akses ke kontrol bisa dilakukan maka dilakukan cara
penulisan seperti yang dicontohkan pada kode program 61 dan 62.
Referensi
http://stackoverflow.com/questions/21470866/windows-phone-8-signalr-connection-method
https://code.msdn.microsoft.com/windowsapps/Windows-Phone-8-Chat-1fa5eccf#content
59
Membuat Project
Langkah pertama untuk membuat project ini adalah dengan klik kanan pada solution
kemudian pilih Add > New Project. Kemudian pilih bahasa Javascript > Store Apps >
Windows App > Blank App (Windows). Kemudian pada kolom nama isi dengan
ClientWinApp. Selanjutnya klik tombol OK.
60
Setelah proses download dan installasi package tersebut selesai maka dapat dilihat pada
project ini terdapat folder Scripts yang berisi file yang berisi file-file Javascript untuk
implementasi SignalR client.
61
Langkah selanjutnya adalah membuat project ini menjadi Startup Project dengan cara klik
kanan pada project ini kemudian pilih Set as Startup Project. Hasilnya dapat dilihat pada
bagian tool bar.
Walaupun peringatan tersebut tetap dapat membuat kode program yang berhubungan
dengan SignalR pada client tetap berjalan dengan baik. Tetapi jika ingin menghilangkan
peringatan tersebut maka perlu ada perubahan pada file script jQuery yang digunakan pada
bagian berikut ini.
62
body,
testElementParent,
testElement,
testElementStyle,
tds,
events,
eventName,
i,
isSupported;
... dan seterusnya ...
return support;
})({});
Maka kode di atas dapat diubah menjadi seperti berikut ini, perubahannya dapat dilihat pada
bagian awal dan akhir baris.
Selanjutnya adalah menulis kode program client SignalR dengan kode Javascript seperti
berikut ini.
63
Uji Coba
Untuk melakukan uji coba client SignalR Windows App ini dapat dilakukan langsung pada
local mechine dengan cara mengklik tombol ini.
64
65
Penjelasan
Pada kode Javascript yang digunakan di atas ada beberapa perbedaan jika dibandingkan
dengan kode Javascript yang digunakan pada bagian Hub sub bahasan tentang Chat Room.
Pada bahasan sebelumnya kode ditulis dengan memanfaatkan kode proxy digenerate
sehingga memudahkan untuk memanfaaatkan pembuatan fungsi hub pada client dan
kemudahan untuk mengakses hub pada server.
Pada kode program 66 di atas dapat dilihat kode untuk melakukan koneksi ke Hub server
tanpa ada bantuan proxy yang digenerate secara otomatis, hal ini bisa diidentifikasi dengan
tidak adanya baris kode berikut ini.
Karena proxy tidak digenerate secara otomatis maka cara penulisan kode mempunyai
kemiripan dengan yang dibahas pada bagian Client Windows Forms dan Client Windows
Phone.
Untuk melakukan koneksi ke server dilakukan dengan kode berikut ini.
var connection = $.hubConnection('http://localhost:30526/signalr/hubs');
var hubProxy = connection.createHubProxy('helloWorld');
Selanjutnya untuk memulai koneksi dapat dilakukan dengan kode berikut ini.
connection.start()
.done(function ()
{
. . .
console.log('Terkoneksi, connection ID=' + connection.id);
})
.fail(function () { console.log('Koneksi tidak dapat dilakukan'); });
66
Pada kode di atas dapat dilihat kode tambahan yang memanggil fungsi console.log, fungsi itu
bertujuan untuk mengeluarkan output pada Javascript console pada Visual Studio.
Sedangkan kode yang digunakan untuk mengirim pesan chat dilakukan dengan
menggunakan kode berikut ini.
67
Referensi
http://stackoverflow.com/questions/10859523/using-jquery-with-windows-8-metrojavascript-app-causes-security-error
http://www.asp.net/signalr/overview/guide-to-the-api/hubs-api-guide-javascriptclient#manualproxy
http://www.codeproject.com/Articles/338916/Windows-JavaScript-Metro-ApplicationGetting-Sta
68
Pada bagian ini akan dibahas bagaimana cara hosting aplikasi SignalR pada server. Biasanya
aplikasi SignalR dipasang pada web server IIS, namun anda dapat juga melakukan self-host
pada aplikasi console maupun pada windows services. SignalR memiliki pustaka self-host
yang dibangun diatas platform OWIN. OWIN dapat memisahkan aplikasi web dari server,
yang membuat OWIN ideal untuk melakukan self-hosting aplikasi web diluar IIS.
Beberapa alasan untuk melakukan self-host adalah :
IIS tidak tersedia, misal server yang sudah ada tidak mempunyai IIS.
Performance overhead jika menggunakan IIS dapat dihindari.
SignalR ditambahkan kedalam aplikasi terdahulu yang sudah berjalan pada
Windows Services atau Azure Worker role.
Membuat Project
Pada tutorial berikut akan dijelaskan cara membuat server menggunakan aplikasi console.
Buka Visual Studio 2013 > kemudian pilih Windows Desktop > pilih Console Application.
69
System;
Microsoft.AspNet.SignalR;
Microsoft.Owin.Hosting;
Owin;
Microsoft.Owin.Cors;
namespace SampleSelfHost
{
class Program
{
static void Main(string[] args)
70
{
string url = "http://localhost:8080";
using (WebApp.Start(url))
{
Console.WriteLine("Server running on {0}", url);
Console.ReadLine();
}
}
}
class Startup
{
public void Configuration(IAppBuilder app)
{
app.UseCors(CorsOptions.AllowAll);
app.MapSignalR();
}
}
public class MyHub : Hub
{
public void Send(string name, string message)
{
Clients.All.addMessage(name, message);
}
}
}
Penjelasan
Kode diatas terdiri dari 3 kelas yaitu Program, Startup, dan MyHub. Pada class program
didefinisikan alamat dari server yang akan dibuat yaitu: http://localhost:8080. Class Startup
berisi konfigurasi dari SignalR server dan memanggil method MapSignalR() yang digunakan
untuk membuat route pada setiap Hub objek pada project. Class MyHub adalah class yang
akan menyediakan method yang dapat diakses oleh client.
Uji Coba
Jalankan aplikasi dengan menekan tombol F5. Maka aplikasi console akan dijalankan pada
url berikut.
71
Membuat Project
Pada solution explorer tambahkan project Web Application baru dengan nama
SampleSelfHostClient.
72
73
$('#PesanChat').val('').focus();
});
});
});
</script>
</head>
<body>
<div class="container">
<input type="text" id="PesanChat" />
<input type="button" id="kirimpesan" value="Kirim" />
<input type="hidden" id="teksnama" />
<div id="AddText"></div>
</div>
</body>
</html>
Penjelasan
Kode diatas mirip dengan kode yang sudah anda tulis pada bagian sebelumnya dari buku ini
tentang penggunaan SignalR Hub. Perbedaan dengan kode sebelumnya adalah adanya
tambahan URL yang digunakan untuk koneksi ke server yaitu:
Uji Coba
Untuk menjalankan kedua project diatas (server dan client) secara bersamaan maka lakukan
langkah berikut. Klik kanan pada solution > pilih Sets Startup Projects > kemudian pilih
multiple startup project > pada project SampleSelfHost dan SampleSelfHostClient ubah action
menjadi Start.
74
Kemudian jalankan aplikasi anda (tekan F5), maka kedua project akan dijalankan secara
berurutan. Seharusnya project server akan dijalankan terlebih dalulu baru kemudian diikuti
dengan project client. Gambar dibawah menunjukan tampilan dari aplikasi client.
Referensi
http://www.asp.net/signalr/overview/deployment/tutorial-signalr-self-host
http://www.c-sharpcorner.com/UploadFile/4b0136/introduction-of-Asp-Net-signalr-selfhosting/
75
Seperti yang sudah anda pelajari pada bagian sebelumnya ASP.NET SignalR dapat digunakan
untuk meningkatkan level interaktifitas antara server dan web atau .NET client. Ketika dihosting pada Microsoft Azure maka SignalR juga akan mendapatkan keuntungan dari Azure
seperti ketersediaan layanan yang dapat diandalkan, skalabilitas, dan performa.
Publish Project
Untuk dapat mempublish aplikasi ASP.NET SignalR kedalam platform Microsoft Azure ada
beberapa persyaratan yang harus dipenuhi terlebih dahulu seperti:
Azure Subscription: anda dapat mendaftar layanan Microsoft Azure versi trial
dengan mengakses url berikut: http://azure.microsoft.com/en-us/pricing/free-trial/
Anda harus menginstall Azure SDK 2.3 untuk Visual Studio 2013 atau Visual Studio
2012.
Penjelasan lengkap tentang hosting aplikasi asp.net di Microsoft Azure juga dapat
dibaca pada tautan berikut.
Setelah semua persyaratan diatas terpenuhi maka buka project yang sebelumnya sudah anda
buat yaitu HelloSignalR.
76
Kemudian klik kanan pada project tersebut > pilih Publish > pilih Microsoft Azure Website >
kemudian masukan username dan password dari akun Microsoft Azure anda.
78
Uji Coba
Untuk mencoba menjalankan aplikasi SignalR yang sudah dipublish pada Azure website,
maka anda dapat masuk kedalam portal Microsoft Azure > kemudian pilih HelloSignalR >
untuk mengetahui alamat url dari aplikasi yang sudah dipublish pilih Dashboard.
79
Pada menu konfigurasi pastikan bahwa .NET Framework version yang digunakan adalah
.NET Framework 4.5.
80
Referensi
http://www.asp.net/signalr/overview/deployment/using-signalr-with-azure-web-sites
http://erickkurniawan.net/2014/07/02/hosting-asp-net-mvc-di-windows-azure-part-1/
81
10
Pada umumnya ada dua cara untuk melakukan scale pada aplikasi web yaitu scale up dan scale
out:
Scale up: berarti menggunakan server yang lebih besar (VM yang lebih besar) dengan
CPU dan RAM yang lebih besar.
Scale out: berarti menambah lebih banyak server untuk menangani load.
Masalah yang dihadapi jika menggunakan solusi scale up adalah anda akan menghadapi
keterbatasan besar server (RAM dan CPU). Karena itu anda akan membutuhkan solusi scale
out. Akan tetapi jika anda menggunakan scale out maka ketika client terkoneksi ke satu server
tertentu tidak akan mendapatkan pesan dari server yang lain.
82
83
Membuat Project
Setelah membuat Cloud Service pada Azure Portal, langkah selanjutnya adalah membuat
Cloud Project pada Visual Studio 2013. Buat new project > pilih Azure Cloud Service > beri
nama ServiceBusChat.
84
85
Kemudian setelah project ASP.NET MVC selesai dibuat, pilih Tools > Nuget Package Manager
> Package manager console, dan tambahkan pustaka ASP.NET SignalR.
86
Menambahkan Kode
Setelah itu pada class ChatHub tambahkan kode untuk SignalR server Hub sebagai berikut.
Kemudian tambahkan kode berikut pada class Startup. Kode untuk backplane juga akan
ditambahkan pada bagian ini (setelah mengambil Service Bus connection string).
Langkah selanjutnya adalah membuat aplikasi client. Karena kita menggunakan project ASP.NET
MVC maka kita dapat menambahkan kode untuk client pada bagian View. Untuk itu tambahkan
dahulu kode berikut pada Controllers\HomeController untuk memanggil View.
Kemudian tambahkan View baru dengan nama Chat pada folder Views\Home.
87
88
</script>
}
Kemudian pada project ChatSampleSR (ASP.NET MVC Project) tambahkan pustaka untuk
SignalR.ServiceBus. Buka Package Manager Console, kemudian tambahkan pustaka berikut.
89
GlobalHost.DependencyResolver.UseServiceBus(connectionString,
"Chat");
app.MapSignalR();
}
}
Publish Aplikasi
Pada tutorial berikut akan dijelaskan bagaimana cara untuk mempublish project Cloud
Service yang sudah kita buat kedalam Microsoft Azure.
90
Uji Coba
Untuk melakukan uji coba aplikasi yang sudah kita publish, anda dapat mengakses Microsoft
Azure Portal > Cloud Services > kemudian pilih signalrsamplebackplane > pilih Dashboard.
Kemudian klik site url berikut: http://signalrsamplebackplane.cloudapp.net/ untuk
menampilkan aplikasi pada browser. Untuk menjalankan aplikasi SignalR Chat, tambahkan
url Home/Chat.
91
Untuk memastikan aplikasi yang kita publish berjalan dengan baik, anda dapat membuka
browser baru untuk mencoba berkomunikasi antar aplikasi.
Referensi
http://www.asp.net/signalr/overview/getting-started/tutorial-getting-started-with-signalrand-mvc
http://www.asp.net/signalr/overview/performance/scaleout-with-windows-azure-servicebus
http://www.asp.net/signalr/overview/performance/scaleout-in-signalr
92
93