Database bağlantılı Ağ içi Grup chat

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
monet
Üye
Mesajlar: 68
Kayıt: 26 Şub 2004 02:12
Konum: İstanbul

Database bağlantılı Ağ içi Grup chat

Mesaj gönderen monet »

Arkadaşlar bu konuyla ilgili bir sürü soru sorulmuş ancak tam olarak benim aradığım gibi değil forum kurallarını da az çok biliyorum o yüzden böyle bir konuyu araştırmadan açtığımı düşünmeyin lütfen :)

Neyse soruma gelmek istiyorum...

Database bağlantılı bir ağ içi grup chat yapmak istiyorum...

Bir table düşünün ve içinde 4 tane alan var..

KullaniciAdi, Şifre, Ipadres, Durum

Kişi her login olduğunda programla, program otomatikman tableda login oldugu kullaniciya karşılık gelen kayıtın IPADRES fieldina kişinin ipadresini, Durum kismina ise "ONLINE" yaziyor...

Kişi her programdan çıkış yaptığında da otomatikman OFFLINE yaziyor ...

Şimdi sorum şu, bu program tabiki ağ içi chat olucak.. Diğer kişiler tabledan durumu ONLINE olanlari goster yapinca ONLINE kisiler, OFFLINE olanlari goster yapinca ise OFFLINE kisiler gözükecek.. Bu kisma kadar yaptim sorun yok.....

Ama asil sorun şu, şimdi kişilerle chat, dosya transferi vs gibi eylemleri ben Socketlerle yaptirmayi düşünüyorum ki böyle olmasi gerekiyor sanirim.. Tamam daha once 2 kişi arasinda olan basit chat programi yaptim 1 tane server socket 1 tane client socket ekliyoduk da... Bu sefer grup chat olunca ve de Online ve offline kişi sayısı değişken olunca.. Sanırım dinamik olarak clientsocket yaratmam gerekiyor.. (Server socket 1 tane ile işim görülüyor sanirim connections özelligini kullanara.. )

Şimdi sorum tam anlamınla şu, ben kişi sayısı kadar dinamik clientsocket yarattım formda kodlarla, peki........ Bu socketin eventlerini nasil kullanicam? Yani bu dinamik clientsocketin OnRead eventi mesela, bunu nasil kullanabilirim? 2. olarak, bu clientsocket ile bağlandığım kişi eğer offline olursa, bu clientsocketi nasil tekrar silicem.. (sanirim .free ile olacak) herneyse... veya kimse offline olmadi yeni bir kişi online oldu.. Bu yeni kişi için nasil clientsocket yaraticam yani şimdi aklimdaki düşünce şu online kişi sayisini bir yere yazdiririm, biri online olunca otomatikman sayi degisecek eski degerle yeni degerden küçükse yeni bir clientsocket yarat ve YENİ Online olan kişiye bağlan.. İşte yeni online olan kişiyi nereden anlayiyacam :)


Soru galiba epey bi uzun oldu büyük ihtimalle okumaya üşeneceksiniz :) Ama inanin çok lazım şimdiden teşekkürler herkese Allah kolaylık versin.
Kullanıcı avatarı
mege
Admin
Mesajlar: 2360
Kayıt: 05 Şub 2004 04:32
Konum: Beşiktaş
İletişim:

Mesaj gönderen mege »

eğer sorduklarınız öğrenmek amaçlı araştırma değilse protokol oluşturmakla uğraşmak yerine indy deki irc serveri kurup kullanabilirsiniz. hem isteyen başka irc clientleriinde kullanabilir.
.-.-.-.-.-.-.-. ^_^
monet
Üye
Mesajlar: 68
Kayıt: 26 Şub 2004 02:12
Konum: İstanbul

Mesaj gönderen monet »

mege yazdı:eğer sorduklarınız öğrenmek amaçlı araştırma değilse protokol oluşturmakla uğraşmak yerine indy deki irc serveri kurup kullanabilirsiniz. hem isteyen başka irc clientleriinde kullanabilir.
Aslında öğrenmek amaçlı değil ama zaten yapınca da otomatikman öğrenmiş oluyorum :) Ama şöyle bişey var irc serveri benim server makinaya kurmam gerekmiyor mu yani o makinada programin sürekli açık olması gerekiyor ama benim dediğim yolla hiç bir makinanın sürekli açık olması gerekmiyor sadece server o da zaten database için sürekli açık olacak.. yani kısacası Irc server yapmak istemiyorum benim yapmak istediğim client socketlerle bağlanmak..

Cevabını bilen yok mu ya aslında tam olarak bu konuyla ilgili cevap da gerekmiyor bana sanırım kısacası bir componenti dinamik olarak yaratıp onun eventlerine ulaşmak... Mesela bana bir butonu dinamik olarak yaratıp onun OnClick kısmına ShowMessage('Butona tıklanıldı'); komutunu çalıştırmayı öğretirseniz çok sevinirim..

Tekrardan kolay gelsin
ZER0
Üye
Mesajlar: 24
Kayıt: 09 Tem 2005 10:14
Konum: İst/Maltepe

Mesaj gönderen ZER0 »

Bunun için şöyle bir yol izlersin öncelikle client socketle tüm ağa aynı mesaj gönderilecek fakat sadece senin seçtiğin kullanıcı adına sahip olan kullanıcı mesajı okuyacak.Bunuda örneğin sen Ahmet'i seçtin;
for i:=0 to Servetsocket1.socket.activeconnections do
Servetsocket1.socket.connections.sendtext(Kullanıcıismi+'Mesajım');

Kullanıcı ismi ahmet olduğu için ilk 5 karekterini copy metodu ile alarak eşleştireceksin eğer eşitse mesajı görebilcek.Tabi bu isim hüseyinde olabilir o yüzden kendi kullanıcı adının uzunluğu kadar okuyup copy metoduyla bu uzunluk kadar alacaksın.Bilmem anlatabildimmi.Neyse takıldığın bişi olursa bana msnden ulaşabilirsin.
Başarılar...
Gökay Okutucu
Sakarya Bilgisayar Programcılığı Öğrencisi
monet
Üye
Mesajlar: 68
Kayıt: 26 Şub 2004 02:12
Konum: İstanbul

Mesaj gönderen monet »

ZER0 yazdı:Bunun için şöyle bir yol izlersin öncelikle client socketle tüm ağa aynı mesaj gönderilecek fakat sadece senin seçtiğin kullanıcı adına sahip olan kullanıcı mesajı okuyacak.Bunuda örneğin sen Ahmet'i seçtin;
for i:=0 to Servetsocket1.socket.activeconnections do
Servetsocket1.socket.connections.sendtext(Kullanıcıismi+'Mesajım');

Kullanıcı ismi ahmet olduğu için ilk 5 karekterini copy metodu ile alarak eşleştireceksin eğer eşitse mesajı görebilcek.Tabi bu isim hüseyinde olabilir o yüzden kendi kullanıcı adının uzunluğu kadar okuyup copy metoduyla bu uzunluk kadar alacaksın.Bilmem anlatabildimmi.Neyse takıldığın bişi olursa bana msnden ulaşabilirsin.
Başarılar...


Hmmm sanırım anladım evet tek bir clientsocketle yapılabilir bu.. Peki tüm ağa bağlanıp mesjaı gondermek performans düşüklüğüne yol açmaz mı? Yani yanlış anlamadıysam bütün online kişilere tek tek bağlanıcak. İlk kayıttaki ipye bağlanıcak ondan sonra ona o mesaji gondericek bağlantıyı koparıcak sonra 2. ye bağlanıp ona mesaji gondercek sonra tekrar ondan disconnect olup 3. ye bağlancak sonra 4. ye sonra 5. ye böyle online kişi sayısı kadar gidiecek.. Peki bu bağlanıp kopma işlemi performans düşüklüğüne yol açmaz mı? Ya da clientsocket ile bir bağlantıyı koparmadan herkese aynı anda bağlanıp hepsine aynı anda bir mesaj atılabiliyor mu yani Serversocketin active connections özelliği yok sanırım onda yni aynı anda 3 5 kişiye bağlanamıyoruz sanırım?..

Evet dediğin sanırım işimi görücek ama işte soru işareti beliriyor kafamda acaba yavaşlığa veya performans düşüklüğüne sebep olur mu diye..
???
MT
ZER0
Üye
Mesajlar: 24
Kayıt: 09 Tem 2005 10:14
Konum: İst/Maltepe

Mesaj gönderen ZER0 »

Sanırım bu yöntem performans düşüklüğüne yol açmaz yani bunu yapan adamlar bu basit konularıda düşünmüşlerdir herhalde.Aslında aynı şeyi bende denemiştim hiçbir sorunla karşılaşmadımda.Gayet sağlıklı bir şekilde çalışmıştı.Birde; aynı programda Tserversocketle bir Tclientsocket çalışabilir.Ama eğer korkuyosan şu şekilde yaparsın; server'a ilk bağlanan, bağlandıktan hemen sonra isminide gönderir.Sende bu isimleri örneğin bir listbox'a atarsın sonra buradan zaten işlemleri yaparsın Yani Ahmet ilk bağlanan kişi Mehmet ise ikinici bağlanan kişi.Sen Mehmet'i seçersen ona mesaj gönderirken Servetsocket1.socket.connections[listbox1.itemindex-1].sendtext(Listbox1.items[listbox1.itemindex]+'Mesajım');
Yapıp gönderdiğinde işlem gerçekleşecektir.Umarım yine fazla karmaşık olmamıştır.Başarılar...
Gökay Okutucu
Sakarya Bilgisayar Programcılığı Öğrencisi
Kullanıcı avatarı
delphist
Üye
Mesajlar: 595
Kayıt: 05 Oca 2005 04:34

Mesaj gönderen delphist »

Indy bileşenlerinde örnekler gayet başarılı ve yeterli diye düşünüyorum. Ayrıca Socket bileşenleri ile de yapabilirsin. Socket bileşenleri ile ilgili Tserversocket tarafında kullanıcı isteklerini bi değişkene aktarıp ki bunla ilgili örnekler var ayrıca sitenin ilk girişindeki makale türü yazılardada birden fazla kullanıcı için socket bileşenlerinin nasıl kullanacağını gayet güzel şekilde anlatıyor. Burda yapman gereken bana göre en güzel yol. Kullanıcılara bir id no verip nicklerini o id no ile kaydetmen ve bu id no ile kişinin ismi veya nickiyle yapacağın işlemlerden hem kolay hem de hata riskini %100 azaltacağı kanaatindeyim. Server tarafını yapıyorsun Client tarafını yapıyorsun ve ilk önce client tan gelen mesajı okuyorsun. ilk iki karakteri userın kullanıcı id sini alırsın yani kısacası kendine bir protokol oluşturman gerekiyor. Ve benimde böyle sorularım olmuştu ve forumda halletmiştik ararsan bulacağın kanaatindeyim...

Kolay Gelsin Başarılar
Cevapla