1. Pendahuluan
Program yang akan dibahas terdiri dari dua bagian, yaitu: Server, sebagai
server yang mana semua client akan mengirim pesan ke computer yang ada aplikasi
ini dan mem-broadcast semua pesan ke client. Client, aplikasi yang
dipakai oleh user untuk melakukan chat yang akan terhubung ke server.
a. 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.
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()
{
Tidak ada komentar:
Posting Komentar