Minggu, 15 April 2012

Aplikasi UDP Chatting Text Sederhana (Visual C#)


Aplikasi chatting sudah mulai banyak dibuat semenjak teknologi internet mulai ada. Dahulu masih terdapat beberapa aplikasi chatting sederhana seperti MIRC dan sekarang kita sudah melihat banyak sekali aplikasi yang digunakan untuk media komunikasi berbasis teks ini dan semakin menarik baik dari segi tampilan maupun performa, salah satu contohnya yaitu yahoo messenger.
Pada postingan kali ini, akan coba dibuat sebuah aplikasi chatting berbasis teks sederhana yang menggunakan protocol UDP sebagai protocol pengiriman datanya. Aplikasi ini dibuat berbasis bahasa pemrograman C# menggunakan visual studio C# 2010.
Ada beberapa bagian dari program yang dianggap memiliki peranan utama pada aplikasi chatting ini yang akan dibahas secara singkat tentang fungsi dan kegunaan dan pengaruhnya terhadap aplikasi secara utuh. Bagian program tersebut adalah sebagai berikut :

using System.Net;
using System.Net.Sockets;
using System.Threading;

bagian program diatas merupakan bagian program yang memanggil library yang akan dipakai sebagai jalur untuk mengakses beberapa fungsi yang diperlukan seperti penggunaan thread, akses port dan socket dan masih banyak lagi.

delegate void AddMessage(string message);

pendeklarasian fungsi AddMessage yang bertipe delegate void, delegate disini digunakan karena adanya pengaksesan sebuah tool (richTextBox) pada 2 buah event yang berbeda.

int port = 11000;
const string broadcastAddress = "192.168.0.255";

bagian program diatas digunakan untuk mendeklarasikan dan mendefinisikan variabel “port” yang mana nantinya nilai variabel ini digunakan sebagai port yang akan digunakan aplikasi untuk mengirimkan dan menerima data. Selain variabel “port”, dideklarasikan serta didefinisikan juga variabel “broadcastAddress” yang mana nantinya variabel ini digunakan untuk mendefinisikan alamat IP tujuan, dari client aplikasi chatting teks ini. Karena nilai pada variabel tersebut adalah IP broadcast, maka nantinya pesan teks yang dikirim akan dikirimkan ke alamat broadcast sehingga setiap client yang terhubung pada satu jaringan akan menerima pesan yang sama. Nilai variabel port dan broadcastAddress ini bisa dirubah sesuai dengan keinginan, atau juga bisa menggunakan nilai inputan dari sebuah textbox pada aplikasi.

UdpClient receivingClient = new UdpClient(11000);
UdpClient sendingClient;
        
Bagian program diatas mendeklarasikan variabel receivingClient dan sendingClient. Pada saat pendeklarasian digunakan tipe UdpClient yang mana tipe ini merupakan hasil akses terhadap library yang telah dijelaskan sebelumnya. Dengan adanya pendeklarasian dengan menggunakan UdpClient ini, menjelaskan bahwa protocol yang digunakan saat pentrasferan data adalah protocol UDP.

Thread receivingThread;
Bagian program ini merupakan pendeklarasian terhadap thread yang akan dibuat dan yang akan digunakan nantinya.

private void InitializeSender()
       {
           sendingClient = new UdpClient(broadcastAddress, port);
           sendingClient.EnableBroadcast = true;
       }
Fungsi diatas merupakan sebuah fungsi yang digunakan untuk inisialisasi terhadap tujuan pengiriman data serta pengaktifan pengiriman secara broadcast yang mana pengirimannya ditujukan kealamat broadcast.

private void InitializeReceiver()
       {     
           ThreadStart start = new ThreadStart(Receiver);
           receivingThread = new Thread(start);
           receivingThread.IsBackground = true;
           receivingThread.Start();
    }
Fungsi diatas digunakan untuk inisialisasi saat aplikasi menerima data dari client/user yang lain. Pada saat fungsi ini dipanggil, maka aka nada pendeklarasian dan inisialisasi terhadap thread yang akan digunakan dan dimanfaatkan untuk menangani data yang masuk yang kemudian akan diolah. Pada saat pengaktifan thread, langsung didefinisikan thread tersebut akan menjalankan fungsi Receiver. Jadi secara otomatis saat ada data masuk ke buffer penerima maka langsung akan ditangani oleh fungsi Receiver.
    private void btnSend_Click(object sender, EventArgs e)
    {
        tbSend.Text = tbSend.Text.TrimEnd();
        
           if (!string.IsNullOrEmpty(tbSend.Text))
           {
               string toSend = "<" + Environment.MachineName + "> : " + tbSend.Text;
               byte[] data = Encoding.ASCII.GetBytes(toSend);
               sendingClient.Send(data, data.Length);
               tbSend.Text = "";
           }
        
           tbSend.Focus();
    }
Fungsi diatas merupakan event dari button yang bernama “btnSend”. Program yang ada pada fungsi ini akan dijalankan jika button “btnSend” ditekan. Program pada fungsi ini berfungsi untuk mengirimkan data yang telah diketikkan pada sebuah textbox yang bernama “tbSend”. Sebelum data dikirimkan, textbox “tbSend” akan dicek terlebih dahulu apakah textbox tersebut kosong atau tidak. Jika tidak kosong, maka dimulailah proses pengiriman data yang ada pada textbox tersebut. Proses pengiriman diawali dengan pengisian data ke variabel bertipe string yang bernama “toSend”, yang mana nilai pada variabel ini terdiri dari nama PC yang digunakan untuk menjalankan aplikasi dan isi dari textbox “tbSend”. Setelah itu, data vari variabel “toSend” dirubah kedalam bentuk byte dan dimasukkan ke variabel “data”. Jadi pesan yang akan dikirimkan merupakan isi dari variabel “data”.

    private void Receiver() {
           IPEndPoint endPoint = new IPEndPoint(IPAddress.Any, port);
           AddMessage messageDelegate = MessageReceived;
        
           while (true)
           {
               byte[] data = receivingClient.Receive(ref endPoint);
               string message = Encoding.ASCII.GetString(data);
               Invoke(messageDelegate, message);
            System.Console.Beep(1500, 300);
           }
       }
Fungsi diatas merupakan fungsi yang digunakan untuk menangani setiap ada data yang masuk melalui port yang digunakan sebagai jalur komunikasi. Pada fungsi ini, akan dideklarasikan lagi IPEndPoint yang digunakan untuk mendefinisikan client/user yang mengirimkan data. Pada fungsi diatas digunakan tipe “Any” pada IPEndPoint nya, ini menandakan bahwa aplikasi akan menerima data dari IP manapun yang masuk ke port yang telah didefinisikan sebelumnya. Data yang masuk akan dirubah dulu kedalam bentuk byte, baru kemudian dirubah lagi kedalam bentuk string yang akhirnya pesan yan gsudah dirubah tersebut akan dikirimkan kesebuah fungsi lain untuk ditampilkan.

       private void MessageReceived(string message)
       {
           rtbChat.Text += message + "\n";
       }
Fungsi diatas merupakan fungsi yang akan dipanggil setelah fungsi Receiver selesai mengubah data yang masuk ke data bertipe string. Fungsi ini bertugas untuk menampilkan data bertipe string tadi kedalam sebuah richTextBox yang bernama “rtbChat”.

Berikut ini merupakan program lengkap nya :
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Net;
using System.Net.Sockets;
using System.Threading;



namespace PeerToPeerChat
{
    public partial class ChatForm : Form
    {
        delegate void AddMessage(string message);
        
        string userName;
        
       int port = 11000;
           const string broadcastAddress = "192.168.0.255";
        UdpClient receivingClient = new UdpClient(11000);
           UdpClient sendingClient;
        
           Thread receivingThread;

        public ChatForm()
        {
            InitializeComponent();
            this.Load += new EventHandler(ChatForm_Load);
            btnSend.Click += new EventHandler(btnSend_Click);
        }

        private void ChatForm_Load(object sender, EventArgs e)
        {
               tbSend.Focus();
               InitializeSender();
               InitializeReceiver();
           }
        
       private void InitializeSender()
       {
           sendingClient = new UdpClient(broadcastAddress, port);
           sendingClient.EnableBroadcast = true;
       }
        
       private void InitializeReceiver()
       {     
           ThreadStart start = new ThreadStart(Receiver);
           receivingThread = new Thread(start);
           receivingThread.IsBackground = true;
           receivingThread.Start();
    }

    private void btnSend_Click(object sender, EventArgs e)
    {
        tbSend.Text = tbSend.Text.TrimEnd();
        
           if (!string.IsNullOrEmpty(tbSend.Text))
           {
               string toSend = "<" + Environment.MachineName + "> : " + tbSend.Text;
               byte[] data = Encoding.ASCII.GetBytes(toSend);
               sendingClient.Send(data, data.Length);
               tbSend.Text = "";
           }
        
           tbSend.Focus();
    }

    private void Receiver() {
           IPEndPoint endPoint = new IPEndPoint(IPAddress.Any, port);
           AddMessage messageDelegate = MessageReceived;
        
           while (true)
           {
               byte[] data = receivingClient.Receive(ref endPoint);
               string message = Encoding.ASCII.GetString(data);
               Invoke(messageDelegate, message);
            System.Console.Beep(1500, 300);
           }
       }
        
       private void MessageReceived(string message)
       {
           rtbChat.Text += message + "\n";
       }
  }
}


Dibawah ini merupakan desain tampilan yang dibuat.


0 komentar:

Posting Komentar