Membuat Aplikasi Chat via Ethernet/Sockets Programming dengan Visual Studio C# 2010

Pendahuluan

Program yang akan dibahas terdiri dari dua bagian, yaitu:

1.       Server, sebagai server yang mana semua client akan mengirim pesan ke computer yang ada aplikasi ini dan mem-broadcast semua pesan ke client.

2.       Client, aplikasi yang dipakai oleh user untuk melakukan chat yang akan terhubung ke server.

Membuat Server

Pertama bukalah aplikasi Visual Studio C# 2010. Lalu pilih new project. Kemudian pilih Console Application dan berilah nama project chat_server pada bagian bawah form, lalu klik OK.

Setelah itu cobalah masukan kode di bawah ini.

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Net.Sockets;

using System.Net;

namespace ConsoleApplication1

{

class Program

{

const int portNo = 500;

static void Main(string[] args)

{

//==================================================================

//Mendapatkan Local Machine’s Host Name & IPAddress

//==================================================================

String strHostName = “”;

if (args.Length == 0)

{

// Mendapatkan Ip address dari local machine…

// Pertama cari host name dari local machine.

strHostName = Dns.GetHostName();

Console.WriteLine(“Local Machine’s Host Name: ” + strHostName);

}

else

{

strHostName = args[0];

}

IPHostEntry ipEntry = Dns.GetHostByName(strHostName);

IPAddress[] addr = ipEntry.AddressList;

for (int i = 0; i < addr.Length; i++)

{

Console.WriteLine(“IP Address {0}: {1} “, i, addr[i].ToString());

}

//===================================================================

System.Net.IPAddress localAdd = System.Net.IPAddress.Parse(addr[0].ToString());

TcpListener listener = new TcpListener(localAdd, portNo);

listener.Start();

while (true)

{

ChatClient user = new

ChatClient(listener.AcceptTcpClient());

}

}

}

}

Setelah itu, buat class baru dengan nama “ChatClient” dengan cara klik kanan pada nama project seperti di bawah ini.

Setelah itu, akan muncul form berikut.


Pilih Class dan jangan lupa beri nama “ChatClient” pada bagian bawah form dan klik Add. Setelah itu coba masukan kode seperti di bawah ini.

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Net.Sockets;

using System.Collections;

namespace ConsoleApplication1

{

class ChatClient

{

//—berisi daftar semua client—

public static Hashtable AllClients = new Hashtable();

//—informasi tentang client—

private TcpClient _client;

private string _clientIP;

private string _clientNick;

//—digunakan untuk mengirim/menerima data—

private byte[] data;

//—apakah nickname sudah dikirim—

private bool ReceiveNick = true;

public ChatClient(TcpClient client)

{

_client = client;

//—mendapatkan client IP address—

_clientIP = client.Client.RemoteEndPoint.ToString();

//—menambahkan client saat ini ke hash table—

AllClients.Add(_clientIP, this);

//—memulai membaca data dari client pada

// thread terpisah—

data = new byte[_client.ReceiveBufferSize];

client.GetStream().BeginRead(data, 0,

System.Convert.ToInt32(_client.ReceiveBufferSize), ReceiveMessage, null);

}

public void ReceiveMessage(IAsyncResult ar)

{

//—membaca dari client—

int bytesRead;

try

{

lock (_client.GetStream())

{

bytesRead = _client.GetStream().EndRead(ar);

}

//—client tidak tersambung—

if (bytesRead < 1)

{

AllClients.Remove(_clientIP);

Broadcast(_clientNick + ” has left the chat.”);

return;

}

else

{

//—mendapat pesan yang telah dikirim—

string messageReceived = System.Text.Encoding.ASCII.GetString(data, 0, bytesRead);

//—client mengirimkan nicknamenya—

if (ReceiveNick)

{

_clientNick = messageReceived;

//—memberitahu semua client memasuki

// chat—

Broadcast(_clientNick + ” has joined the chat.”);

ReceiveNick = false;

}

else

{

//—memberikan pesan pada semuanya—

Broadcast(_clientNick + “>” + messageReceived);

}

}

//—melanjutkan membaca dari client—

lock (_client.GetStream())

{

_client.GetStream().BeginRead(data, 0,

System.Convert.ToInt32(_client.ReceiveBufferSize),ReceiveMessage,null);

}

}

catch (Exception ex)

{

AllClients.Remove(_clientIP);

Broadcast(_clientNick + ” has left the chat.”);

}

}

public void SendMessage(string message)

{

try

{

//—mengirim text—

System.Net.Sockets.NetworkStream ns;

lock (_client.GetStream())

{

ns = _client.GetStream();

}

byte[] bytesToSend =

System.Text.Encoding.ASCII.GetBytes(message);

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

ns.Flush();

}

catch (Exception ex)

{

Console.WriteLine(ex.ToString());

}

}

public void Broadcast(string message)

{

//—log secara lokal—

Console.WriteLine(message);

foreach (DictionaryEntry c in AllClients)

{

//—memberi pesan pada semua user—

((ChatClient)(c.Value)).SendMessage(

message + Environment.NewLine);

}

}

}

}

Membuat Client

Buatlah project baru dan pilih template Windows Form Application dan berilah nama project tersebut dengan nama “chat” pada bagian bawah form lalu klik OK. Setelah itu, buatlah form seperti pada gambar di bawah ini.

Setelah itu coba buatlah kode seperti di bawah 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;

namespace WindowsFormsApplication1

{

public partial class Form1 : Form

{

const int portNo = 500;

TcpClient client;

byte[] data;

public Form1()

{

InitializeComponent();

}

private void btnSignIn_Click(object sender, EventArgs e)

{

if (btnSignIn.Text == “Sign In”)

{

try

{

//—menghubungkan ke server—

client = new TcpClient();

client.Connect(IPServer.Text, portNo);

data = new byte[client.ReceiveBufferSize];

//—membaca dari server—

SendMessage(txtNick.Text);

client.GetStream().BeginRead(data, 0,

System.Convert.ToInt32(

client.ReceiveBufferSize),

ReceiveMessage, null);

btnSignIn.Text = “Sign Out”;

btnSend.Enabled = true;

}

catch (Exception ex)

{

MessageBox.Show(ex.ToString());

}

}

else

{

//—disconnect dari server—

Disconnect();

btnSignIn.Text = “Sign In”;

btnSend.Enabled = false;

}

}

private void btnSend_Click(object sender, EventArgs e)

{

SendMessage(txtMessage.Text);

txtMessage.Clear();

}

public void SendMessage(string message)

{

try

{

//—mengirim pesan ke server—

NetworkStream ns = client.GetStream();

byte[] data =

System.Text.Encoding.ASCII.GetBytes(message);

//—mengirim text—

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

ns.Flush();

}

catch (Exception ex)

{

MessageBox.Show(ex.ToString());

}

}

public void ReceiveMessage(IAsyncResult ar)

{

try

{

int bytesRead;

//—membaca data dari server—

bytesRead = client.GetStream().EndRead(ar);

if (bytesRead < 1)

{

return;

}

else

{

//—memanggil delegate untuk menampilkan

// data yang diterima—

object[] para = {System.Text.Encoding.ASCII.GetString(data, 0, bytesRead) };

this.Invoke(new delUpdateHistory(UpdateHistory),

para);

}

//—melanjutkan membaca…—

client.GetStream().BeginRead(data, 0,

System.Convert.ToInt32(client.ReceiveBufferSize),

ReceiveMessage, null);

}

catch (Exception ex)

{

//—abaikan error, dibuang ketika pengguna sign off—

}

}

//—delegate dan subroutine untuk mengupdate TextBox control—

public delegate void delUpdateHistory(string str);

public void UpdateHistory(string str)

{

txtMessageHistory.AppendText(str);

}

public void Disconnect()

{

try

{

//—Disconnect dari server—

client.GetStream().Close();

client.Close();

}

catch (Exception ex)

{

MessageBox.Show(ex.ToString());

}

}

private void Form_Closing(object sender,FormClosingEventArgs e)

{

Disconnect();

}

}

}

Setelah itu, double clik pada Form1.Designer.cs dan tambahkan kode seperti di bawah ini.

private void InitializeComponent()

{

this.FormClosing += new

System.Windows.Forms.FormClosingEventHandler(this.Form_Closing);

}

Setelah kedua aplikasi diatas (chat server dan client) sudah selesai dibuat, maka program bisa langsung dites pada komputer yang berbeda atau pada satu komputer. Akan tetapi, jika menggunakan satu komputer, aturlah IP address yang diakses oleh client adalah “127.0.0.1” (computer’s loopback address).

————————————————————————————————————-

Daftar Pustaka

http://www.codeproject.com/KB/cs/network.aspx

Lee, Wei-Meng[2007].”Practical .NET 2.0 Networking Projects”. Apress, New York, USA.

56 Responses to Membuat Aplikasi Chat via Ethernet/Sockets Programming dengan Visual Studio C# 2010

  1. akbar says:

    om bagi unduhan projek yang udah jadi dong

  2. tata says:

    artikelnya sangat membantu..
    apakah anda pernah membuat koneksi database dengan socket pada c#? jika iya, mhn sedikit info tentang itu… thanx

  3. candra says:

    ==============================================================
    double clik pada Form1.Designer.cs dan tambahkan kode seperti di bawah ini.
    private void InitializeComponent()
    {

    this.FormClosing += new
    System.Windows.Forms.FormClosingEventHandler(this.Form_Closing);
    }
    ===============================================================
    pake nya gimana??

    • wangready says:

      buka file Form1.Designer.cs, lalu copy paste code berikut.
      this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.Form_Closing);
      cuman buat deklarasi aja…
      pke cara lain jg bisa, double click di propertis bagian FormClosing.

  4. Guz Surya says:

    gan , kox ngk mw jalan gan . . ,, errornya terletak di Class Chat_Clientnya saya gan . . ,, dibilang gni : The type or namespace nama “Chat_Client” could not be found . . .,, gimana ni gan ? mohon pencerahannya gan . . . .

    • wangready says:

      masa sih gan error…
      Oh, mungkin itu gan nama Class Chat_Client nya ganti jadi ChatClient…soalnya class yang dipanggil di program utama

      while (true)
      {
      ChatClient user = new
      ChatClient(listener.AcceptTcpClient());
      }

      jd, kayaknya beda ketik aja gan, pakenya ChatClient bukan Chat_Client

  5. gan….aku error na di bagian

    this.FormClosing += new
    System.Windows.Forms.FormClosingEventHandler(this.Form_Closing);

    itu aja masala gg mw jln..
    gimana tu ?

    • wangready says:

      double clik pada Form1.Designer.cs atau pke cara lain jg bisa, double click di propertis window cari bagian FormClosing. Lalu tambahkan kode yg dipertebal hurufnya di bawah ini.
      private void InitializeComponent()
      {

      this.FormClosing += new
      System.Windows.Forms.FormClosingEventHandler(this.Form_Closing);

      }

  6. Deni says:

    Cara Make aplikasinya gmn??

    • wangready says:

      yang dipake buat chat, pake aplikasi Client dengan satu server untuk satu jaringan chat yang sama…
      Misal:
      Computer A mau chat sama computer B, maka aplikasi client dijalankan di computer A dan B. Sementara aplikasi server dijalankan juga di A (di computer B juga bisa, ini misal aja). Terus masukan username pada aplikasi client, dan masukan IP address dari computer yang menjalankan aplikasi server, Klik Sign In. Habis itu, langsung bisa chatting….
      Gitu gan…

  7. bingung says:

    gak ada
    private void InitializeComponent()
    {

    }
    di Form1.designer.cs gimana donk ini

  8. Kuznetsov says:

    Itu cara pake applikasinya jalankan chat_server dulu baru jalankan program chat yah????? itu berlaku di komp 1 dan komp 2???

    • wangready says:

      iya, server dlu. Program server sebenarnya bisa dijalankan di kompi mana saja dalam jaringan. Yang penting program chat client diisi alamat IP address kompi chat server…

  9. baglug sagita says:

    bang gimana caranya (kodingnya) biar temen” yang online keliatan semua pada form client..!

    • wangready says:

      Klo yang seperti itu sya belum pernah buat. Mungkin bisa dicoba pake timer untuk mengirim status dari client tiap waktu tertentu, dengan kode tertentu, yang ditampilkan pada area yg dikhususkan untuk melihat yg online.

  10. ari says:

    gan …kalo programnya ditambah biar tau siapa ja yang tersmbung ke server gmn cranya??

  11. ari says:

    gan nambahin keterangan waktu saat krim pesan dan sign in gimna ya???

    • wangready says:

      Klo yang seperti itu sya belum pernah buat. Mungkin bisa dicoba pake timer untuk mengirim status dari client tiap waktu tertentu, dengan kode tertentu, yang ditampilkan pada area yg dikhususkan untuk melihat yg online. Klo untuk keterangan waktu bisa ngambil data di PC yang jalanin program server.

  12. adi says:

    private void InitializeComponent()

    {

    this.FormClosing += new

    System.Windows.Forms.FormClosingEventHandler(this.Form_Closing);

    }
    gan aq error d … itu,apa isinya itu?

    • wangready says:

      bagian yg ini private void InitializeComponent() adalah bagian yg otomatis di generate oleh visual studio nya. karena ditambahkan komponen baru (komponen form_closing) maka komponen tsb hrs dideklarasikan yaitu this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.Form_Closing);. Biar tidak usah mengedit manual, bisa langsung aja double click di propertis window (biasanya di bagian kanan panel) cari bagian FormClosing (double klik disitu, nanti akan tergenerate fungsinya).

  13. lisna says:

    gan using system.Linq bwt apa ya?punya q msh salah di situ

  14. Wiss says:

    Ane ijin copy gan! Nice post….!! THks ya gann

  15. alisha says:

    sya mw tny, klo dijlankn lwt 1 komputer gmn crax? klo sya jlankn yg klwr comman prompt
    da tulisn
    Local Host Name:Lila-PC
    IP Address0:10.227.35.166

    • wangready says:

      bisa aja lwt 1 komputer, tinggal jalankan program server nya kemudian jalankan program client nya…trus setting di program client IP address nya seperti yang tertera di atas IP address0, atau localhost atau 127.0.0.1

  16. yono says:

    ada 2 pertanyaan :
    1.ketika menjalankn dgn 2 komp, pa perlu pke kabel utp?
    2.ketika saya run menggunakan 1komp, alamat IP sya ketik seperti diatas pada client, sudah berhasil, kemudian progrm saya tu2p, ketika progrm sya buka gi kq alamat IP server otomatis berubah jd 127.0.0.1 ? jd ketika sya mau chat sudah g perlu ngetik alamat IPnya pada client, apa memang seperti itu?

    • wangready says:

      1. intinya harus ada media komunikasi nya, baik intu network atau peer-to-peer, kabel atau wireless.
      2. kalo itu, saya jg gk tau…

      • yono says:

        klo pake wireless gmn caranya?

      • wangready says:

        kalo pake wireless sama aja, intinya di hardware modul wireless nya, kalo udah beli yang sudah jadi, biasanya dikasih datasheet nya, nah d datasheet nanti dikasih lg protokol komunikasinya…emang mau pake wireless apa mas, RF, bluetooth atau WLAN wifi ?

  17. prima says:

    makasi kk sangat membantu🙂

  18. Rizki says:

    salam kenal mas Endang🙂

    kalau versi Java-nya gimana yah mas…? soalnya saya baca2 blog ini banyak jg ngebahas soal Java menggunakan NetBeans IDE😀

    1. sebagai client bisa gak mengetahui network interface yang ada di server…? seperti hardware2 yang sedang terkoneksi ke server. sebelumnya client sudah bisa terkoneksi ke server….

    2. saya bingung perbedaan mendasar antara DataOutputStream-ObjectOutputStream-BufferedOutputStream, DataIntputStream-ObjectInputStream-BufferedInputStream dan BufferedReader dan kapan digunakan. saya googling banyak menemukan contoh aplikasi client-server, tapi masukannnya (perintah) dalam bentuk readline (system.in). nahhh yg sedang saya coba buat itu, masukannya dari textfield. saya sudah nyoba ngirim ke server menggunkan DataOutputStream-ObjectOutputStream tapi kok server nya gak menerima masukan dari client. data2 yg dikirim sudah saya coba dalam bentuk STRING, UTF, OBJECT dan BYTES (ex : dos.writebytes(“perintah”);

    ###SISI CLIENT###

    void SendMessage() {
    String msgo = ClientWindow.txt_ClientMessage.getText();
    try {
    chatdos.writeUTF(msgo);
    chatdos.flush(); //
    } catch (IOException ex) {
    Logger.getLogger(ClientForm.class.getName()).log(Level.SEVERE, null, ex);
    }
    ClientWindow.txt_ClientLog.append(“\nc # ” + msgo);
    ClientWindow.txt_ClientMessage.setText(“”);
    }

    void IOStream() throws IOException {
    if (chatdis != null) {
    dataFromServer = chatdis.readUTF();

    System.out.println(“\nbrFromServer ” + dataFromServer);
    System.out.println(“\nfrom server ” + chatdis.readUTF());
    ClientWindow.txt_Status.append(“\n” + chatdis.readUTF());

    bData = chatdis.readByte();
    System.out.println(“\nfrom server byte ” + chatdis.readByte());
    ClientWindow.txt_Status.append(“\nbyte ” + chatdis.readByte());

    do {
    try {
    message = (String)in.readObject();
    System.out.println(“server>” + message);
    ClientWindow.txt_Status.append(“server>” + message);
    //sendMessage(“Hi my server”);
    //message = “bye”;
    //sendMessage(message);
    } catch(ClassNotFoundException classNot){
    System.err.println(“data received in unknown format”);
    }
    } while(!message.equals(“quit”));
    }
    }

    ###SISI SERVER###

    void IOStream() throws IOException {
    do {
    try{
    message = (String)in.readObject();
    ServerWindow.txt_ServerLog.append(“client>” + message);

    switch (message) {
    case “time”:
    sendMessage(“\nServer Date ” + new Date().toString());
    break;
    case “net”:
    sendMessage(InetAddress.getByName(“\nlocalhost”).toString());
    break;
    case “ipconfig”:
    sendMessage(InetAddress.getByName(“\nIPCONFIG”).toString());
    break;
    case “quit”:
    sendMessage(“\nServer Closed”);
    Quit();
    break;
    }

    } catch(ClassNotFoundException classnot){
    System.err.println(“Data received in unknown format”);
    }
    } while(!message.equals(“quit”));

    }

    void sendMessage(String msg) {
    try {
    out.writeObject(msg);
    out.flush();
    System.out.println(“server>” + msg);
    } catch(IOException ioException){
    ioException.printStackTrace();
    }
    }

    makasih mas🙂

  19. ardy says:

    bos klw buat program chat ,dmna client bisa memilih sendiri jenis font-nya masing2 gmna caranya???

  20. hasmi says:

    salam,
    gan, aplikasi ini bisa di buat pake TCP server ga?
    jadi niatnya ini d buat TCP server, nantinya ada client yang ngirim data pake modem GSM ke server ini, sehingga data yg d kirim dr client bisa tampak di aplikasi ini?
    maaf masih newbie hehe
    makasi

  21. hasmibaih says:

    bang, gitu butuh winsock ga sih bang? gua pemula baru mulai belajar ttg aplikasi socket gni
    Soalnya saya baca2 itu kalau buat aplikasi socket itu butuh winsock gitu
    mohon pencerahannya thx

  22. hasmibaih says:

    iya bang barang kali ada tutorial yg lebih mendasar dari pdf gt bang, saya ngikuti ini kok eror hehe
    baru pertama megang vibi ini bang

  23. dita says:

    system.NullReferenceException: Object Reference not set an instance
    of an object.
    at windowsformApplication1.form1.disconnect()in

    • dita says:

      artinya apa ya mas? program jalan tapi gak bisa chat, nick di isi apa mas? terimakasih

      • wangready says:

        error d program chat atau program servernya?
        nick maksudnya nama user nya mba….
        kan ada 2 program, aktifkan dulu program server nya baru program chatnya…

  24. Pitens says:

    – Gan ini terkoneksinya pake Internet atau nggk sih?
    – klo nggk, ada jaraknya gk seberapa jauh bisa terkoneksi?
    – klo pake Webcam bsa gak Gan? klo bisa n ada Post dong Gan….Thanks

    • wangready says:

      belum nyoba gan kalau di jaringan internet, saya baru nyoba dalam satu jaringan LAN saja dengan subnet yg sama…kalo webcam blm nyoba gan, pernah jg lewat server xampp (ada di blog), atau bisa pake aplikasi webcam xp buat streaming server video…

  25. ismael says:

    sorry nggaggu gan…
    mau tanya donk ko ane ada errornya yak?
    emngnya ngaruh klo pake vs2008?
    errornya di ‘ConsolApplication1.ChatClient’ does not contain a constructor that takes ‘1’ argument.
    yg salahnya di mari
    “ChatClient(listener.AcceptTcpClient());”

  26. gan kok gk muncul aplikasi chat nya?

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s