Kamis, 13 Februari 2014

Pemrograman Socket Bag. 3 (Aplikasi Chat Server - Multi Client)

Setelah di bagian 1 dan 2 kita membahas mengenai Dasar Pemrograman Socket dan Multithreading, maka pada bagian 3 ini kita akan membahas mengenai pembuatan aplikasi yang menerapkan keduanya, ya aplikasi chat server multi client ini mengimplementasikan socket dan multithread. Socket digunakan untuk komunikasi dalam jaringan, sedangkan multithread untuk memproses beberapa method dalam waktu bersamaan.

Aplikasi ini terdiri dari 2 project yaitu Chat Server dan Chat Client, maka pembahasan ini juga dibagi menjadi 2 bagian penting. Sebelum mengikuti langkah-langkah pembuatan aplikasi ini, perhatikan penampakan project aplikasi ini dan penampakan ketika running :


1. Chat Server
Project chat server ini terdiri dari 2 class, yaitu class Program.cs dan class handleClient.cs. Untuk kemudahan dalam mempelajari kode program ini, saya akan memulai pembahasan dari class Program.cs, walaupun akan terjadi error pada saat kita akan menciptakan objek dari class handleClient.cs. Kalau anda tidak ingin menemui error saat penulisan baris kode program, maka anda dapat memulai dengan membuat clas handleClient terlebih dahulu. Namun bagi saya, saya tetap memilih untuk membuat Program.cs terlebih dahulu agar pembahasan lebih mudah difahami. Berikut akan dijelaskan baris-baris kode di dalam kedua class ini. Tambahkan namespace yang diperlukan di dalam project chat server :
using System.Net;
using System.Net.Sockets;

Class Program.cs :
  • Di dalam method main() (diantara blok try... catch...), ketikkan kode :
int cntClient = 0;
ASCIIEncoding asc = new ASCIIEncoding();
Socket socket;
IPAddress ipAddress = IPAddress.Parse("127.0.0.1");
TcpListener tcpListener = new TcpListener(ipAddress, 8000);
tcpListener.Start();
  • Setelah server berada dalam status listening, tampilkan informasi ke layar konsol bahwa server sedang running dan diikuti dengan informasi IP Address dan Port yang digunakan server untuk mendengarkan request koneksi dari client :
Console.WriteLine("Server running...");
Console.Write("Local End Point : " + tcpListener.LocalEndpoint);
  • Di dalam looping while(), terima koneksi dari client, hitung setiap client yang terhubung dan ciptakan sebuah objek dari class handleClient untuk menghandle client yang terhubung. Di dalam class handleClient ini nantinya akan dibuat thread baru untuk melayani client tersebut.
    while (true)
    {
       cntClient++;
       socket = tcpListener.AcceptSocket();
       Console.WriteLine("\n\n\nConnection accepted from " + socket.RemoteEndPoint);
       Console.WriteLine(">> Client no : " + Convert.ToString(cntClient));
     
       handleClient hdlClient = new handleClient(socket, cntClient);
       socket.Send(asc.GetBytes("Welcome client, your number is " + Convert.ToString(cntClient)));
    }
  • Tambahkan informasi error pada bagian catch... :
catch (Exception ex)
{
   Console.WriteLine("Error : " + ex.Message);
   Console.ReadLine();
}

Selanjutnya kita akan membuat class handleClient. Di dalam class handleClient ini, namespace yang diperlukan adalah :
using System.Threading;
using System.Net.Sockets;

Class handleClient.cs :
  • Variable global yang dibutuhkan di dalam class handleClient :
public class handleClient
{
   Socket hcSocket;
   int hcCntClient;
   .
   .
   .
}
  • Constructor class handleClient :
    public handleClient(Socket socket, int cntClient)
    {           
       this.hcSocket = socket;
       this.hcCntClient = cntClient;
       Thread thread = new Thread(doChat);
       thread.Start();          
    }
  • Buat method doChat() untuk menerima data (pesan) yang dikirim oleh client. Method ini dijalankan pada thread baru :
private void doChat()
{
  while (true)
  {
      try
      {
          byte[] b = new byte[10000];
          int k = hcSocket.Receive(b);
          Console.Write("\nClient " + hcCntClient.ToString() + " : ");
          for (int i = 0; i < k; i++)
          {
              Console.Write(Convert.ToChar(b[i]));
          }
      }
      catch (Exception ex)
      {
          Console.WriteLine("\n\nClient " + hcCntClient.ToString() + " not available...");
          Console.WriteLine(ex.Message);
          break;
      }
  }                
}

2.  Chat Client
Di dalam project chat client ini hanya terdapat satu buah class, yaitu class Program.cs. Client akan menghubungi server berdasarkan informasi ip address dan port yang diberikan. Setelah client mencoba menghubungi server, maka server akan menerima koneksi dari client, kemudian server akan menciptakan thread baru untuk melayani client ini. Selanjutnya client akan berkomunikasi dengan server melalui thread tersebut. Begitu seterusnya, setiap ada client baru maka server akan menciptakan sebuah thread baru untuk melayaninya, sehingga server akan bisa melayani seluruh client secara bersamaan.
Pada program kali ini, client hanya bertugas mengirim pesan ke server, dan server hanya bertugas menerima pesan dari client dan menampilkannya di layar konsol.
Mari kita mulai menulis kode program dengan terlebih dahulu menambahkan namespace yang diperlukan :
using System.Net.Sockets;
using System.IO;
 
Di dalam method main(), tuliskan kode untuk melakukan koneksi dengan server :
TcpClient tcpClient = new TcpClient();
Console.WriteLine("Connecting...\n");
tcpClient.Connect("127.0.0.1", 8000);
Setelah terhubung ke server, persiapkan untuk menerima data/pesan dari server, karena begitu client terhubung ke server, maka server akan segera mengirim pesan pemberitahuan ke client tersebut :
Console.WriteLine("Message from server : ");
Stream stream = tcpClient.GetStream();
byte[] bb = new byte[10000];
int k = stream.Read(bb, 0, 10000);
 
Tampilkan data/pesan yang diterima ke layar konsol client :
for (int i = 0; i < k; i++)
{
    Console.Write(Convert.ToChar(bb[i]));
}
Tampilkan pesan ke layar konsol bahwa chat antara client dengan server siap dilakukan :
Console.WriteLine("\n\nStarting to chat... ");
Di dalam looping while(), simpan string pesan yang diketik oleh user, kemudian setelah tombol enter ditekan bangun jalur komunikasi dengan server, ubah tipe data string menjadi byte, kemudian kirimkan data ke server. Ulangi terus proses ini sampai client menutup program atau koneksi ke server terputus.
while (true)
{
   Console.Write(">> ");
   String str = Console.ReadLine();
   stream = tcpClient.GetStream();
   ASCIIEncoding asc = new ASCIIEncoding();
   byte[] ba = asc.GetBytes(str);
   stream.Write(ba, 0, ba.Length);
}

Selesai sudah tutorial bagian 3 ini. Dalam project sebenarnya, saya menempatkan blok try... catch... di beberapa method penting dan di setiap looping while() untuk menjebak error. Namun dalam pembahasan diatas, saya tidak menuliskan semua blok try...catch..., agar mudah difahami bagi yang baru belajar. Untuk mendapatkan project lengkapnya silahkan download disini.

Tidak ada komentar:

Posting Komentar