SERVER CLIENT UYGULAMASI II
C# Programlama dili ile yapılmış örnek bir server – client mesajlaşma programı. Bilgisayarlar arası haberleşme uygulamasının 2. kısmı.
Bu uygulama SERVER – CLIENT uygulama yazı dizisinin 2. Bölümüdür. İlk bölümünde Server taraflı kodları yazmıştık. Bu kodlara ve açıklamasına yazı sonundaki linkten ulaşılabilir. Client uygulamasını çalıştırabilmek için server uygulamasınında yazılıp çalıştırılması gerekir. Her iki uygulama dışında port numaraları dışında fazla bir değişiklik göremeyeceksiniz. Bunun sebebi hem server kısmının hem de client kısmının çift taraflı çalışıyor olmasıdır. Yani client server e, server cliente veri yollayıp karşı taraftan veri alabilir. Uygulamayı ikiye ayırmamın sebebi tabii daha kolay anlaşılabilmesini sağlamak. Ayrıca Server programı ana makine üzerinde olabilir. Veri tabanı kaydı veya başka özel bir işlem yapılacaksa Server tarafına yazılacak ilave kodlarla bu işlem yapılabilir. Böylece sadece verileri gönderip alan kullanıcılar ile, aldığı verileri işleyen bir server programı olmuş olur. Buna ilişkin örnekleri ileride vermeyi düşünüyorum.
Uygulamaya gelince Server bölümündeki kodları bir program, client bölümündeki (bu bölüm) kodları bir program yapıyoruz, tabii her programın adı ayrı olacak. Daha sonra bu programların her ikisini de çalıştırıyoruz. DİNLE buttonlarına basarak programların ilgili portları dinlemesini sağlıyoruz. Mesaj kutusuna bir şey yazarak GÖNDER buttonuna bastığımızda metin karşı tarafa gönderilecek ve karşı tarafın gönderdiği alındı mesajı labele yazılacaktır.
Öncelikle aşağıdaki gibi bir ekran tasarımı oluşturuyoruz. 2 listbox, 1 text box 3 adet button ve 3 adet label işimizi görecektir.

Button2 karşı bilgisayarı dinleme komutları içermektedir. Bu buttona tıklayınca kanal aktif hale gelir.
kanal = new Thread(Client_Listen);
kanal.Priority = ThreadPriority.Normal;
kanal.IsBackground = true;
kanal.Start();
button2.Text = "DINLEMEDE";
Oluşturduğumuz kanal nesnesine dinleme prosedürünü değişken olarak gönderiyoruz.
Kanal.Abort() yazıp bu komuta bağlı buttona tıklayınca program donmaktadır. Esasen bu donma olayı bilgisayarın kanalı kendi istediği zaman kapatmak istemesinden kaynaklanıyor. Kanal.IsBackground komutu programı kapatırken donma meydana gelmesini engeller.
Client_Listen, dinleme prosedürüdür. TcpListen nesnesi tanımlanarak port numarası değişken olarak verilmiştir. Bu port numarası client PC de bulunan ve server bilgisayarının mesajları yolladığı portun numarasıdır.
Button1_click eventine servera mesaj gönderecek kodlar yazılmıştır. Biz her iki uygulamayı da aynı bilgisayarda çalıştırdığımız için her iki programa da IP numarası olarak 127.0.0.1 değerini girdik, bu değer kendi bilgisayarınızın internetsiz IP numarasıdır. Ağ üzerinde bu uygulamayı çalıştıracak olursanız hedef makinanın IP numarasını girmelisiniz.
Diğer kodların açıklamaları yanlarına yazılmıştır.
Kolay Gelsin.
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Net.Sockets;
using System.Net;
using System.Threading;
namespace Clientsrvr
{
public partial class Form1 : Form
{
public const int portno = 38000;//Dinlenecek port numarası
public Thread kanal;
public Form1()
{
InitializeComponent();
}
delegate void clientdg(string datax);
public int i = 1;
TcpListener tcplisten;
public void Client_Listen()
{
tcplisten = new TcpListener(portno);//Tcplistener tanımla dinlenecek port numarasını gir
try
{
while (true)
{
tcplisten.Start(); //dinlemeye başla
Socket socket1 = tcplisten.AcceptSocket();//socket nesnesini porta bağla
Byte[] okunan = new Byte[1024];
int boyut = socket1.Receive(okunan, okunan.Length, 0);//socketdeki veriyi bayt dizisine aktar
string dataokunan = System.Text.Encoding.Default.GetString(okunan);//bayt dizisindeki değeri stringe çevir, dil ayarını yap
String gidenveri = "CLIENT: Mesajınız Alınmıştır";// Karşı tarafa bir mesaj göndersin
Byte[] gidenbyte = System.Text.Encoding.Default.GetBytes(gidenveri.ToCharArray());//Gönderilecek mesaj bayt dizisine alınsın
socket1.Send(gidenbyte, gidenbyte.Length, 0);//socket veriyi göndersin
i++;// kaç değer geldi saysın
Clientproxy(dataokunan);//delege yordamlarında listboa eklensin
Clientproxy2(socket1.RemoteEndPoint.ToString());
}
}
catch (SocketException ec)
{
MessageBox.Show("Veri Alımında Hata");
}
}
private void Clientproxy(string veri)
{
if (this.listBox1.InvokeRequired)
{
clientdg delx = new clientdg(Clientproxy);
this.listBox1.Invoke(delx, new object[] { veri });
}
else
{
listBox1.Items.Add(veri);
listBox1.Update();
}
}
private void Clientproxy2(string dtx)
{
if (this.listBox2.InvokeRequired)
{
clientdg dlg = new clientdg(Clientproxy2);
this.listBox2.Invoke(dlg, new object[] { dtx });
}
else
{
listBox2.Items.Add(dtx);
listBox2.Update();
}
}
private int kx = 1;
private void Form1_Load(object sender, EventArgs e)
{
button2.Text = "DINLE";
button1.Text = "MESAJ GÖNDER";
button3.Text = "TEMIZLE";
label1.Text = "MESAJLAŞMA";
label2.Text = "GÖNDEREN IP";
label3.Text = "";
this.Text = "CLIENT";
}
TcpClient tcpcln;
private void button1_Click(object sender, EventArgs e)
{
try
{
TcpClient tcpcln = new TcpClient("127.0.0.1", 28015);//Tcpclient nesnesi yaratılarak veri gönderilecek PC nin Ip ve port numarası atanıyor
NetworkStream netws = tcpcln.GetStream();//Networkstream nesnesi oluşturuluyor
if(netws.CanWrite)//yazma modunda ise
{
Byte[] giden = Encoding.Default.GetBytes("CLIENT >> "+textBox1.Text);
netws.Write(giden, 0, giden.Length);
Clientproxy("CLIENT >> " + textBox1.Text);
Clientproxy2("Local IP");
}
else
{
tcpcln.Close();
return;
}
if(netws.CanRead)//okuma modunda ise karşı makinenin gönderdiği alındı mesajı labela yazılsın
{
byte[] oku=new byte[tcpcln.ReceiveBufferSize];//alındı mesajının büyüklüğüne göre dizi yarat
netws.Read(oku, 0, (int)tcpcln.ReceiveBufferSize);//Networkstream nesnesindeki veriyi bayt dizisine aktar
string gelen = Encoding.Default.GetString(oku);//bayt dizisine aktarılan veriyi dil ayarlarını yaparak stringe aktar
tcpcln.Close();//tcpclient ile açılan portu kapat
label3.Text = kx.ToString() + " " + gelen;
}
else
{
tcpcln.Close();
return;
}
kx++;
}
catch
{
MessageBox.Show("Veri Gönderme Hatası");
}
}
ThreadStart listenx;
private void button2_Click(object sender, EventArgs e)
{
kanal = new Thread(Client_Listen);
kanal.Priority = ThreadPriority.Normal;
kanal.IsBackground = true;
kanal.Start();
button2.Text = "DINLEMEDE";
}
private void button3_Click(object sender, EventArgs e)
{
listBox1.Items.Clear();
listBox2.Items.Clear();
}
}
}
SERVER CLIENT -I SERVER KODLARI
SANATSAL BİLGİ
09/08/2017