Soket programlama ile basit bir kullanıcı girişi kontrol nasıl yapılır? Live server Uygulaması nasıl yapılır?
soket programlama ile basit bir uygulama yapalım.
Servis projesi için 3 adet Class olsun
Service1 ana classımız, Listener dinleyeceğimiz class, Client istekleri oluşturacağımız sınıfımız olsun.
Burada windows servis olarak soket programlama yapalım.
Mantık larak bir adet soket programlamayı yöneteceğimiz veri tabanı işlemleri yapacağımız servisimiz olacak.
bu servisimizde soketi dinleyebileceğimiz ve dinleme işlemleri yapacağımız Listener dinleyici class ı ve ve istekte bulunan istemcileri tutacağımız client sınıfımız bulunuyor
Servis ten sonra client için ayrı bir proje olacaktır. Aşağıda linklerini daha sonra görebilirsiniz.
Burada server da bir soket açarak dinlemeye alacağız. Bir client bağlandığı zaman listener_SocketAccepted eventi tetiklenecek ve burada client nesnesi oluşturularak listeye eklenecek. her bir client oluşturulurken bir guid atanacak böylece clientleri ayırt edebileceğiz.
Daha sonra gelen mesajları client_Received ile birlikte handle edeceğiz ve handle içerisinde her bir client nesnesi içinde döneceğiz eğer guidleri eşleşirse hangi clientten geldiğini anlayabileceğiz.
public partial class Service1:ServiceBase{
static Listener listener;
/* Burada daha sonra oluşturacağımız dinleme işlemleri için oluşturduğumuz nesneyi tanımlıyoruz*/
List
// gelen istekleri bir sınıf oluşturarak listede saklayabileceğimiz object listemizi oluşturuyoruz.
public Service1(){ //constructure'ımız
InitializeComponent();
//Servisin componentleri yüklemesi için kendi fonksiyonu
listener = new Listener();
//Burada listenerı oluşturuyoruz listener ın initializinde gerekli tanımlamalar yapılıyor
listener.SocketAccepted += new Listener.SocketAcceptedHandler(listener_SocketAccepted);
//listener objesinde eğer bağlantı geldiyse oluşturduğumuz event tetiklenecektir. listener_SocketAccepted methodu tetiklenir.
}
protected override void OnStart(string[] args){
//life cycle da tetiklenen initialize dan sonraki metot
listener.Start();
//listener objesini initialize de oluşturmuştuk. burada Listener classında oluşturduğumuz Start metodu ile dinlemeye başlıyoruz
}
void listener_SocketAccepted(Socket e){
//listener bağlantı gelirse tetiklenen event
Client client = new Client(e);
//gelen isteği yeni bir client olarak oluşturuyoruz.
client.Received += new Client.ClientReceivedHandler(client_Received);
//clientten gelen istekleri yakalıyoruz.
client.Disconnected += new Client.ClientDisconnectedHandler(client_Disconnected);
//client bağlantısı koparsa tetiklenecek event
clientList.Add(client);
//client i listemize ekliyoruz multiple olarak kullanmak için.
}
private void client_Received(Client sender, byte[] data){
//Clientlerden gelen istekler yakalanıyor ve listedeki ile client eşleşmesine göre işlem yapılacak
for (int i = 0; i < clientList.Count; i++){
try{
byte[] gonderBakalim;
Client client = clientList[i];
if (client.clientId == sender.clientId)
{//client bağlanan ile eşleşmiş ise
string gelendata = Encoding.ASCII.GetString(data);
//gelen datayı aldı10:14 3.10.2022
if (Encoding.ASCII.GetString(data).Contains("USERID") && Encoding.ASCII.GetString(data).Contains("USERNAME")) {//eğer gelen json USERID yada USERNAME içeriyorsa kullanıcı girişi demektir
client.uc = JsonConvert.DeserializeObject
//gelen json dan KULLANICI nesnemizi deserialize ediyoruz bu class ı kendinize göre düzenleyebilirsiniz.
DataSet result = client.getConnectedClient(client);
//Bağlı clientler listesini veri tabanından çekiyoruz burada connetc olurken diğer claslarda insert edeceğiz.
if (result.KULLANICIGIRISKONTROL.Rows.Count > 0)
{//burada giriş başka ipden ise diğer oturumları sonlandırması için clientlere mesaj attıktan sonra client list den sileceğiz.
foreach (DataRow dataRow in result.KULLANICIGIRISKONTROL)
{
Client find = clientList.Where(x => x.clientId == dataRow["CLIENTID"].ToString()).FirstOrDefault();
//client i listemizde guide göre arıyoruz
if (find != null && find.EndPoint.Address.ToString() != client.EndPoint.Address.ToString())
{//Eğer veritabanındaki client eşleşmiş ise ve client ipsi başka ise deaktif etmek için yapılan işlemler
if (find.clientId == client.clientId)
{
continue;
}
byte[] sdataDISCONNECT = Encoding.ASCII.GetBytes("DISCONNECT");
//cliente DISCONNECT stringini gönderiyoruz daha sonra client bunu alınca bağlantıyı koparacağız.
find.socket.BeginSend(sdataDISCONNECT, 0, sdataDISCONNECT.Length, SocketFlags.None, new AsyncCallback(sendCallback), null);
//dosyayı gönderiyoruz send calback methoduna dönen cevap geliyor biz bu metodu oluşturup kullanmayacağız null da yapabilirsiniz.
find.clientDelete(find);//burada sveri tabanından soketi siliyoruz.
}
}
byte[] sdataWILLCLOSEDOTHERSESSIONS = Encoding.ASCII.GetBytes("WILLCLOSEDOTHERSESSIONS")
client.socket.BeginSend(sdataWILLCLOSEDOTHERSESSIONS, 0, sdataWILLCLOSEDOTHERSESSIONS.Length, SocketFlags.None, new AsyncCallback(sendCallback), null);
//diğer girişlerin sonlandırıldığının bilgisini oturum açan cliente bilidiriyoruz.
Thread.Sleep(20); //yeni bir soket bağlanıp karışmaması için veya ikinci bağlantıyı yapıp karışmaması için
}
var findinDataset = result.KULLANICIGIRISKONTROL.AsEnumerable().Where(t => t.Field
if (findinDataset.Count > 0)
{
//bla bla bla
}
else
{
client.clientInsert(client, data); //yeni clientimizi veri tabanına insert ediyoruz.
}
client.Aktif = 1;
WriteFile.write(DateTime.Now + "::Aktif edilen = " + client.ID);
gonderBakalim = Encoding.ASCII.GetBytes("CONNECTED");
client.socket.BeginSend(gonderBakalim, 0, gonderBakalim.Length, SocketFlags.None, new AsyncCallback(sendCallback), client.socket);
//bağlandı bilgisini cliente iletiyoruz
}
else
{
//bu kısımda serverda clientten gelen diğer mesajlara göre işlemler yapılarbilir
//mesela tüm client bilgilerini anlık diğer clientlere foreach ile atarak mesajlaşma uygulaması yapılabilir.
string test = "servisten gonder bakalim else";
gonderBakalim = Encoding.ASCII.GetBytes(test);
client.socket.BeginSend(gonderBakalim, 0, gonderBakalim.Length, SocketFlags.None, new AsyncCallback(sendCallback), client.socket);
}
}
}
catch (Exception ex)
{
WriteFile.write(DateTime.Now + "::client_Received Exception : " + ex.InnerException.Message + " - Client ID = " + sender.uc.USERID);
}
}
}
}
}
}