Home / Pemrograman / C# / Pemrograman Jaringan Dengan C# TCP/IP Chat Server

Pemrograman Jaringan Dengan C# TCP/IP Chat Server

Pemrograman Jaringan Dengan C# – TCP IP Chat

TCP/IP merupakan protokol komunikasi yang banyak digunakan pada komunikasi data via jaringan baik itu melalui wireless ataupun secara wired. Pada dasarnya protokol TCP/IP terdiri dari dua bagian yaitu server dan client. Server memiliki tugas membuka port untuk komunikasi, kemudian menunggu request dari client, kemudian melakukan komuniksi dengan client, dan menutup port komunikasi dengan client. Sedangkan client hanya bertugas untuk melakukan koneksi ke server dengan port yang telah disesuaikan, kemudian melakukan komunikasi ke server, dan memutuskan koneksi ke server. Secara umum gambaran dari interaksi client-server tersebut dapat dilihat pada gambar di bawah ini.

Pemrograman Jaringan Dengan C#
Pemrograman Jaringan Dengan C#

Pada C# sudah disediakan library untuk komunikasi dengan protokol TCP/IP ini. Librarynya berada pada System.Net dan System.Net.Socket. Kali ini yang akan kita buat adalah aplikasi chat pada bagian servernya saja :). Pertama design form UI nya seperti di bawah ini.

Pemrograman Jaringan Dengan C#
Pemrograman Jaringan Dengan C#

 

Sourcecode lengkapnya kira-kira seperti dibawah ini.

  
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.Sockets;
using System.Net;
using System.Threading;

namespace Chat_Server
{
    public partial class Form1 : Form
    {
        TcpListener server;
        TcpClient client;
        NetworkStream ns;
        Thread thread;

        string clientIPAddress;

        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            byte[] dataKirim = new byte[1024];
            server = new TcpListener(int.Parse(textBox1.Text));            
            server.Start();
            MessageBox.Show("Server Ready");
            client = server.AcceptTcpClient();            
            ns = client.GetStream();       
            clientIPAddress = IPAddress.Parse(((IPEndPoint)client.Client.RemoteEndPoint).Address.ToString())+"" ;
            richTextBox1.Text += clientIPAddress + " => Connectedn";
            dataKirim = Encoding.ASCII.GetBytes("Hy,, Kamu telah terkoneksi ke server !!nr");
            ns.Write(dataKirim, 0, dataKirim.Length);
            thread = new Thread(bacaData);
            thread.IsBackground = true;
            thread.Start();
        }

        private void bacaData()
        {            
            while (true)
            {
                byte[] dataTerima = new byte[1024];
                if (ns.Read(dataTerima, 0, dataTerima.Length) > 0)
                {
                    UpdateLogTextFromThread(Encoding.ASCII.GetString(dataTerima));
                }
            }
        }

        delegate void UpdateLogTextFromThreadDelegate(String msg);

        public void UpdateLogTextFromThread(String msg)
        {
            if (!this.IsDisposed && richTextBox1.InvokeRequired)
            {
                richTextBox1.Invoke(new UpdateLogTextFromThreadDelegate(UpdateLogText), new Object[] { msg });
            }
        }

        public void UpdateLogText(String msg)
        {
            richTextBox1.Text += clientIPAddress + " : " + msg ;
            richTextBox1.SelectionStart = richTextBox1.Text.Length;
            richTextBox1.ScrollToCaret();
        }

        private void button3_Click(object sender, EventArgs e)
        {
            byte[] dataKirim = new byte[1024];
            dataKirim = Encoding.ASCII.GetBytes(textBox2.Text + "nr");
            ns.Write(dataKirim, 0, dataKirim.Length);
        }

        private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            thread.Abort();
            ns.Close();
            client.Close();
            server.Stop();
        }
    }
}


Sekarang kita bedah sourcecodenya !!

Untuk membuat aplikasi chat pada bagian server, kita dapat menggunakan class yang bernama TCPListener dan TCPClient. Pada class TCPListener telah disediakan fungsi/method yang diperlukan oleh sebuah server. Diantaranya adalah untuk membuat koneksi/membuka port. Sedangkan pada class TCPClient disediakan fungsi untuk menunggu request dari client, mengetahui ip adress client yang terkoneksi, dll.
Berikut ini merupakan potongan code untuk membuat koneksi pada sisi server.

  
server = new TcpListener(int.Parse(textBox1.Text));            
server.Start();

Sedangkan di bawah ini merupakan code untuk menunggu request koneksi dari client

 
client = server.AcceptTcpClient();

Untuk proses pengiriman ataupun menerima data kita membutuhkan class untuk proses streaming. Class yang digunakan adalah NetworkStream, pada class ini terdapat sebuah method yang dapat digunakan untuk mengirim ataupun menerima data. Perlu diketahui data yang akan dikirimkan ataupun diterima adalah berupa data byte. Sehingga jika kita ingin mengirimkan string langsung tidak bisa, string harus dikonversi terlebih dahulu menjadi byte. Untuk mengkonversinya dapat dilakukan dengan memanfaatkan class Encoding, contohnya seperti baris code berikut.

dataKirim = Encoding.ASCII.GetBytes("Hy,, Kamu telah terkoneksi ke server !!nr");

Setelah di konversi baru kita bisa mengirimkan data tersebut dengan code seperti berikut

ns.Write(dataKirim, 0, dataKirim.Length);

Begitu juga dengan proses terima data, data yang  diterima adalah berupa byte. Jika ingin merubahnya menjadi string bisa menggunakan code seperti di bawah ini.

UpdateLogTextFromThread(Encoding.ASCII.GetString(dataTerima));

Tentunya proses penerimaan data harus terjadi secara continue atau terus menerus, tidak perlu menekan button terlebih dahulu baru kemudian data dibaca. Sehigga setiap ada data masuk langsung ditampilkan pada richTextBox1. Namun hal ini tidak mungkin dilakukan, karena jika program membaca data terus menerus lha kapan proses pengirimanya dilakukan ? Hingga akhirnya program akan hang dan tidak merespon event lainnya. Oleh karena itu untuk proses penerimaan data kita membutuhkan sebuah thread yang berjalan secara background. Thread tersebut nantinya hanya menjalankan tugas untuk menerima data dan menampilkannya pada richTextBox1. Thread tersebut akan diaktifkan pada saat client sudah terkoneksi ke server.

thread = new Thread(bacaData);
thread.IsBackground = true;
thread.Start();

Jika thread tersebut telah di start maka method bacaData akan running secara terus menerus dan tidak akan mengganggu program utama. Pada method bacaData ini kita dapat membuat program untuk pembacaan datanya dan kemudian menampilkannya ke richTextBox1.

private void bacaData()
        {            
            while (true)
            {
                byte[] dataTerima = new byte[1024];
                if (ns.Read(dataTerima, 0, dataTerima.Length) > 0)
                {
                    UpdateLogTextFromThread(Encoding.ASCII.GetString(dataTerima));
                }
            }
        }

Jika berada pada thread yang berbeda kita tidak dapat mengeset langsung properties-properties yang dimiliki objek. Contohnya richTextBox1.Text = “saya”; dijalankan pada thread yang berbeda, hal ini akan membuat error pada program. Agar hal itu dapat dilakukan, kita harus melakukan proses delegate. Pada prinsipnya kita harus membuat method untuk mengeset properti dari objek, kemudian method tersebut yang kita panggil dari thread yang berbeda tadi.

delegate void UpdateLogTextFromThreadDelegate(String msg);

        public void UpdateLogTextFromThread(String msg)
        {
            if (!this.IsDisposed && richTextBox1.InvokeRequired)
            {
                richTextBox1.Invoke(new UpdateLogTextFromThreadDelegate(UpdateLogText), new Object[] { msg });
            }
        }

        public void UpdateLogText(String msg)
        {
            richTextBox1.Text += clientIPAddress + " : " + msg ;
            richTextBox1.SelectionStart = richTextBox1.Text.Length;
            richTextBox1.ScrollToCaret();
        }

Thread yang telah kita aktifkan tadi pada saat program telah di close akan masih tetap hidup walaupun form nya telah tertutup. Untuk membuktikannya dapat dilihat pada Process pada task manager, walaupun form telah tertutup namun process tetap berjalan. Jika hal ini dibiarkan maka akan membebani komputer kita. Oleh karena itu pada saat form ditutup maka thread juga harus dimatikan, koneksi juga harus ditutup. Kita dapat menambahkan code berikut pada saat event form closing.

private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            thread.Abort();
            ns.Close();
            client.Close();
            server.Stop();
        }

Sekarang kita lakukan uji coba program chat server yang telah kita buat. Karena aplikasi chat client nya belum ada, maka kita gunakan aplikasi bantuan yaitu TeraTerm. Pada ujicoba kali ini kita tidak perlu menggunakan dua buah komputer yang saling terkoneksi, cukup menggunakan satu komputer saja. Kita akan memanfaatkan IP local untuk koneksinya. Apa bisa hanya menggunakan satu komputer saja ? Ya kita coba saja !!!
Install dahulu TeraTerm pada komputer, Kemudian jalankan chat server yang telah kita buat. Kemudian klik button Open Port. Setelah itu buka aplikasi TeraTerm, pilih koneksi TCP/IP. Pada bagian service pilih yang Other, kemudian pada bagian port sesuaikan dengan port yang digunakan oleh server. Karena kita menggunakan port 2000, maka pada bagian port kita isikan 2000 juga. Untuk IP Address gunakan IP Address local 127.0.0.1.

Pemrograman Jaringan TCP IP
Pemrograman Jaringan TCP IP

Kemudian klik OK, jika pada kedua aplikasi muncul seperti dibawah ini maka koneksi sudah OK. Namun jika tidak, mungkin ada kesalahan pada penulisan port atau port server belum terbuka (belum klik Open Port).

Pemrograman Jaringan TCP IP
Pemrograman Jaringan TCP IP

Sekarang kita setting dahulu TeraTerm agar dapat menampilkan apa yang kita ketikkan. Pada Setup => Terminal beri centang pada bagian Local Echo, kemudian pada bagian transmit pilih CR+LF.

Pemrograman Jaringan TCP IP C#
Pemrograman Jaringan TCP IP C#

Sekarang kita coba ketikkan pada TeraTerm untuk mengirim data ke client. Apa yang kita ketikkan akan muncul pada aplikasi server.

Pemrograman Jaringan TCP IP C#
Pemrograman Jaringan TCP IP C#

Kemudian kita coba mengirimkan data dari server ke client dengan mengisi textBox2 kemudian klik Send, maka apa yang kita ketikkan akan muncul pada TeraTerm 🙂

Pemrograman Jaringan TCP IP C#
Pemrograman Jaringan TCP IP C#

Sourcecode lengkap dari program dapat di download pada link berikut ini http://www.mediafire.com/?sdk9g4p10pnkfbn

Sekian tutorial kali ini, semoga bermanfaat 🙂

About Eko Rudiawan

Seorang lelaki yang punya ketertarikan dengan dunia elektronika dan robot yang saat ini sedang serius belajar tentang dunia bisnis dan internet marketing. My dream to be success technopreneur

7 comments

  1. ini bisa di buat pengiriman TCP/IP dengan modem GSM ga? jadi client ngirim data lwt modem GSM gt gmn? thanks

  2. cara mengetahui klo kita pake port 2000 itu gmn ya mas?? makasih byk sblmny..

  3. Mas boleh minta source code lengkapnya dong mas
    soalnya dalam linknya file udah didelete

  4. web ente keren bro .. ada iklannya , wordpress kan ?
    itu iklan google adsense ?

Leave a Reply

Your email address will not be published. Required fields are marked *

seven + five =