server kapalıysa sorun oluyor...

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Gold_Lady
Üye
Mesajlar: 142
Kayıt: 03 Nis 2006 08:39
Konum: İş Yerinden :)
İletişim:

server kapalıysa sorun oluyor...

Mesaj gönderen Gold_Lady »

merhaba... sitedeki ilk mesajım. üye olmak için çok bekledim. :D bugüne kısmetmiş. umarım uzun bir birliktelik ve paylaşım süreci olur...
diyorum ve başlıyorum. :) soracagım o kadar çok şey var ki zaman kaybetmek istemiyorum. :D

işletim sistemi:windows xp ve windows 98 / server windows xp
programlama dili:delphi 7

bir tane depo takip programı yapıyorum. client - server şeklinde çalışıyor. ağda 10 tane makina var, kiminde windows xp yüklü kiminde windows 98.
buraya kadar tamam. sorun yok. o kısmı bitirdim. ancak programı kullanacak olanlar program içinden chat tipi ağda haberleşme için bir modül eklememi istediler. tamam onuda ekledim ancak server program kapatıldıgında clientler bunu algılayamıyor. chat dediğime de bakmayın sadece servere mesaj atıp sadece server makinayı kullanandan mesaj alsalar yeter. diğer client makinaların kendi aralarında mesajlaşmasına gerek yok.
yani yapmak istediğim şey, server kapatıldıgında clientlerin bunu algılaması serverin kapandıgını bilmeleri ve server acıldıgında clientlerin yine bunu algılayıp otomatik bağlanmaları. Çok profesyonel değilim, acemide sayılmam, giriş seviyesinin biraz üzerinde Delphi bilgim var. ona göre yardımcı olursanız kod olarak yada mantık olarak yardım ederseniz cok sevinirim.
iyi günler, iyi çalışmalar dilerim...
not: arama yaptım ancak istediğim şeyi tam olarak bulamadım.
mkysoft
Kıdemli Üye
Mesajlar: 3110
Kayıt: 26 Ağu 2003 12:35
Konum: Berlin
İletişim:

Mesaj gönderen mkysoft »

mesajlaşma sistemini veri tabanı üzerinde de yapabilirsin.mesajları bir tabloda tutarsın. böylece peoblem olmaz.

başka bir yoluda şöyle olmalı. connection yaprtığın nesnesin timeout süresi olması lazım. karşı tarafa ulaşamayınca otomatik bağlantıyı keser ve disconnect yada error olalayları oluşur. buradan istediklerini yapabilirsin sanırım. Eğer nesnesinin böyle bir özelliği yoksa bir timer nesnesi koyup servere'a ping atarsın hayatta olup olmadığına bakarsın.

kolay gelsin.
Gold_Lady
Üye
Mesajlar: 142
Kayıt: 03 Nis 2006 08:39
Konum: İş Yerinden :)
İletişim:

Mesaj gönderen Gold_Lady »

timeout, Indy Client bileşenindeki terminatewaittime olayı mıdır?
birde delphide nasıl ping atacagım ve ping sonucunu programa nasıl yorumlatacagım?
mkysoft
Kıdemli Üye
Mesajlar: 3110
Kayıt: 26 Ağu 2003 12:35
Konum: Berlin
İletişim:

Mesaj gönderen mkysoft »

ping atan indy companenti vardı sanırım. belki jedi'de de olabilir tam hatırlamıyorum.
terminatewaittime sanırım bu olay olabilir. Deneme yapabilrisin.
Kullanıcı avatarı
zynex
Üye
Mesajlar: 87
Kayıt: 02 Nis 2006 02:53
Konum: Çanakkale

daha kolay olabilir

Mesaj gönderen zynex »

Şuan kullandığın sistemini değiştirmek istemiyorsan şöyle bişey yapabilirsin yanlış anlamadıysam şuan mesejlaşma sistemini oluşturmuşsun server programının kapanma olayına bir kod yazarak clientlere serverin programın kapandığını bildirebilirsin clientlerdede bu kapanmayı gördüklerinde yine bir kod çalıştırarak kapalı olduğu durumlarda mesaj gönderememyi sağlayabilirsin. Tabi serverin istem dışı kapanmalarında elinden hiç bişey gelmez kolay gelsin
Gold_Lady
Üye
Mesajlar: 142
Kayıt: 03 Nis 2006 08:39
Konum: İş Yerinden :)
İletişim:

Mesaj gönderen Gold_Lady »

şu an kullandıgım sistemi değiştirmek istemiyorum diye birşey yok. düzgün çalışsında baştan yazarım kodları o sorun değil.

birde bu haberleşmeyi yapmak için ben her makina için bir server nesnesi ve her makina için ayrı port kullandım doğru yapmışmıyım,
mkysoft
Kıdemli Üye
Mesajlar: 3110
Kayıt: 26 Ağu 2003 12:35
Konum: Berlin
İletişim:

Mesaj gönderen mkysoft »

iki kişi özel konuşuyorsa doğru ama mesajlar herkese gisiyorsa UDP ile broadcast yapmanı tavsiye ederim (Bir alt ağ maskesindeki herkes mesaj gödermek).
Gold_Lady
Üye
Mesajlar: 142
Kayıt: 03 Nis 2006 08:39
Konum: İş Yerinden :)
İletişim:

Mesaj gönderen Gold_Lady »

Merhaba.
@mkysoft:
Yazılanların diğer kişiler tarafından görünmemesi lazım. Özel diyebiliriz.

Birde şu database üzerinden mesajlaşmaya aklım takıldı. Forumda arattım "database üzerinden mesaj" şeklinde ancak pek bişey bulamadım.

Dün şöyle bir şey denedim. Server makinede stok programının kullandığı database içine mesaj isminde bir tablo oluşturdum. Kolon isimlerine komut ve mesaj verdim. Client makinalardan IBEvents nesnesi ile serverdeki mesaj isimli tabloyu kontrol ettirdim. Serverden mesaj gönderilince mesaj isimli tablonun komut kısmına "1" yazdırdım. mesaj kısmına da kullanıcının gönderdiği mesaj yazılacak şekilde düzenledim.

Serverden mesela mesaj isimli tabloya bağlı olan kullanıcıya (her kullanıcı için mesaj,mesaj1... vb. şeklinde mesajlaşma için tablo oluşturacagım) mesaj gittiğinde onu algılaması ve komutu yorumlaması içinde client makinedeki dbedit nesnesinin onchange olayına komutun tanımlarını verdim. mesela komut olarak 1 gönderildiğinde mesaj var, komut olarak 2 geldiğinde bilgisayarı kapat v.s.... gibi. Umarım anlatabilmişimdir. :roll:

Sistem tam istediğim gibi olmasada şimdilik çalışıyor. Tabi server makina clientlerden önce açıldıysa. :!:

Sormak istediğim, Bu durum ağda bir yığılmaya sebep olur mu? Çünkü 10 tane client makina serverdeki kendi isimleri için açılmış tablolara sürekli bağlı kalacaklar ve sürekli tablo içeriği değişti mi diye kontrol edecekler.

Birde son olarak sormak istediğim, internet kafelerde kullanılan kafe takip programlarının mantığı hakkında bilgisi olan var mı arkadaşlar. Belki oradan bir şeyler çıkarabilirim. Mesela o tip programlarda server programın kurulduğu makina kapalıysa client buna nasıl tepki veriyor. Mesela server kapandı, bir clientte daha sonra kilitlendi veya kapatılması gerekti (server kapatıldığı için değil) client kapandı açıldı ama server açık değil. buna client makinenin tepkisi ne olur? İnternet cafelerde hiç böyle bir şey başıma gelmedi de size sorayım dedim...:oops:

şimdiden teşekkür eder, iyi günler dilerim...
mkysoft
Kıdemli Üye
Mesajlar: 3110
Kayıt: 26 Ağu 2003 12:35
Konum: Berlin
İletişim:

Mesaj gönderen mkysoft »

eventslerle yapman daha iyi olmuş tabi ama benim kastım normal tablo idi. tabiki sisteme yüklecenektir. bir timer nesnesi koyarak mesajları kontrol edebilirsin. bir süre sonra müşteri mesajlar geç gidiyor diyecektir. En güzeli kur bir email server onu kullansınlar :) Free olanları var. mesala BusinessMailServer 50 kullancıya kadar ücretsiz. Hem mesajların loglanması açısındanda önemli. ayrıca attach olayıda var.
Neyse diğer teknik hakkında yazmak gerekirse;

Ben internet kafe trarzı bir program yazmıştım. İlk yaptığım sistemde makineler iki portlu idi. bir portu sürekli dinliyor diğeriyle mesaj atıyordu. Ana makina açılınca dinleme portunu açıyordu. Bir client açılınca ana makinanın bekleyen portuna mesaj atıyordu. Ana makina onu başka bir porta alarak konuşuyordu.ip'sini hafızada tutuyordu. ona erişmek isteyince clint'in dinlediği porta mesaj atıyordu. Bu sistemde bağlantı sürekli online olmadığından makinaların resetenip resetlenmediğini yada düzgün kapatılmazsa kapandığını anlayamıyordum.
Yeni bir alt yapı üzerine yazdım. Bu sefer yine server bir portu sürekli dinliyordu, client açılınca servera kendini tanıtan mesaj atıyordu server da onu array bir tcpip companentine atıyordu (her client'a ayrı port). Ama bağlantı hiç kopmuyordu. Nesnenin otomatik timeout süresi vardı. Kendi içinde sanırım ping atarak orada olup olmadığına bakıyor nesne. Time out olduğunda clientların düştüğünü anlıyordum. Aynı şekilde clint eğer serverdan "açıl port:xxx" mesajı alamazsa açılmıyordu ve 30 saniyede bir yeniden deniyordu. yada normal süre içinde server düşerse yine otomatik olarak clientler kapanıyordu ve 30 saniyede bir serveri kontrol ediyordu.

Sen tabiki clientleri kitlemeyeceksin onun dışında diğer mantık işine yarayabilir.

Bence eğer makinalar aynı alt ağ maskesinde iseler ve her kullancıı bir birinini mesajını görecekse broadcast mesajlaşma yapman. Bunun örneği vardı sanırım delphi içinde.

(Bu arada bu programı vbasicte yazmıştım hala nasıl yazmışım çözemedim)
Gold_Lady
Üye
Mesajlar: 142
Kayıt: 03 Nis 2006 08:39
Konum: İş Yerinden :)
İletişim:

Mesaj gönderen Gold_Lady »

merhaba...
serverin clientleri kontrol etmesi için şöyle bir kod yazdım.

Kod: Tümünü seç

begin;
ICMP3.ReceiveTimeout := 1000;        // indy paketindeki ping atan nesne
ICMP3.Host := '192.168.1.2';            // indy paketindeki ping atan nesne
ICMP3.port:= '1100';                      // indy paketindeki ping atan nesne
    try
    begin;
         ICMP3.Ping;                      // indy paketindeki ping atan nesne
         Application.ProcessMessages ;
         masa3image.Picture.LoadFromFile('d:\depostok\images\bilg2.ico');
         listbox1.Items.Add (' Masa 3 Bağlı ');
         end;
    except
    begin;
         masa3image.Picture.LoadFromFile('d:\depostok\images\ay.ico');
         listbox1.Items.Add ('Masa 3 Kapalı Görünüyor');
         end;
end;
    

Ağda kullanılan bir IP adresine bu kod ile ping attığım zaman bir sorun yok. ancak host adresi olarak ağda kullanılmayan bir IP yazdıgımda yada alakasız bir IP yazdıgımda mesela 111.111.1.1 gibi ping yine olumlu dönüyor. :roll:

Bilgisayar isimlerine göre ping atıyım dedim bu seferde ping attıgım makina kapalıysa program kasım kasım kasılıyor. 30 saniye kadar kilitleniyor. Antifreeze koydum forma ama fayda etmedi.
Sorun ne sizce arkadaşlar nerede hata yapıyorum yada neyi unuttum...
Kolay gelsin, iyi çalışmalar...
Kullanıcı avatarı
MicroChip
Kıdemli Üye
Mesajlar: 1119
Kayıt: 02 Ağu 2003 01:02
Konum: İstanbul
İletişim:

Mesaj gönderen MicroChip »

30 sn bayağı çokmuş
indy nin kendi sample larına baktınızmı?


saygılar...
Kafkas Kartalı Kabarday
Sitesi!= http://www.ahmetceylan.com
Resim
Gold_Lady
Üye
Mesajlar: 142
Kayıt: 03 Nis 2006 08:39
Konum: İş Yerinden :)
İletişim:

Mesaj gönderen Gold_Lady »

Indy orneklerine baktım, zaten bir tane örnek vardı ping atmakla ilgili.
Ya birde ben bu kodu bir pc için ornek olarak gonderdım. bir pc olunca 30 sanıye degılde 3-4 sanıye kasıyor program. bunu timer ile sürekli her dakika 10 bilgisayar için yapınca, eger kapalı bilgisayar varsa 30 sanıye kadar kasıyor.
yanlıs anlama olmasın... :oops:
kutal
Üye
Mesajlar: 48
Kayıt: 14 Kas 2005 10:48

Mesaj gönderen kutal »

selam
yanlış bilmiyorsam 4 tane ping paketi gönderiliyor ve timeout değeri 1000 milisaniye olduğundan 4 saniye açık olmayan makine için harcanıyor.
pratikte pinge bir LAN üzerinde en yavaş cihaz 10 milisaniyede cevap verir. durum böyle olunca time out için 1000 mili saniye çok uzun bir süre olur ve sizin 10 açık olmayan cihaz için 30-40 saniye bekleminize yol açar.
timeout değerinizi çok daha az tanımlarsanız bekleme azalacaktır sanırım.
denerseniz ve bizide haberdar ederseniz memnun olurum

iyi çalışmalar...
balıkçıdan balık isteme, balık tutmayı öğretmesini iste....
Gold_Lady
Üye
Mesajlar: 142
Kayıt: 03 Nis 2006 08:39
Konum: İş Yerinden :)
İletişim:

Mesaj gönderen Gold_Lady »

Timeout sürelerini 10 a düşürdüm ancak çok fazla birşey farketmedi. Belki 4-5 saniye falan.
Makina isimlerine ping atarak bu iş olmayacak sanırım, en iyisi IP numaralarını ağ bağlantılarından sabitleyip direk IP ye ping atmak... :roll:
Bunun ilerde bir zararı olur mu? Şu an makinalar internete bağlanmak için otomatik IP alıyorlar.
Gold_Lady
Üye
Mesajlar: 142
Kayıt: 03 Nis 2006 08:39
Konum: İş Yerinden :)
İletişim:

Mesaj gönderen Gold_Lady »

Merhaba.

Makina ismine değilde IP leri sabitleyip direk IP ye ping atınca sorun büyük ölçüde çözüldü. Tabi timeout sürelerini 10 a düşürdüm.
Bir şey daha sormak istiyorum.

Mesela server program porttan dinliyor, client bağlantı kurdu, client servere serverde cliente mesaj falan yollamadılar. client servere ne kadar süre bağlı kalır, program yada bilgisayar kapanmasa bile bağlantı kopabilir mi?
Birde IP numarası nasıl bir değişken olmalı. Integer, string, double, float vs.
kolay gelsin, iyi çalışmalar.

Birde son olarak şunu ekleyim bu yapmaya çalıştığım program ticari amaçlı değil, hem bir iki şey öğreniyim hemde birilerine faydam olsun diye uğraşıyorum. Aklınızdan hem bişey bilmiyor hemde oturmuş program yazıp satmaya çalışıyor diye geçmesin. :oops:
Cevapla