TcpServer - TcpClient - Konu Araştırması

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
destiny24
Üye
Mesajlar: 131
Kayıt: 22 Tem 2010 09:42

TcpServer - TcpClient - Konu Araştırması

Mesaj gönderen destiny24 »

Arkadaşlar Merhaba,

Başlıkta da yazdığım gibi aslında sormak istediklerim TcpServer ve TcpClient ile alakalı.

Bir uygulama yapmak istiyorum. Program çalıştığında belirtmiş olduğum adresteki server'da çalışan TCPServer nesnesine bağlanacak.Bu programı aynı anda 100 kişi de çalıştırıyor olabilir.
Başka bir client programda belirtilen işlemlerden birini yaptığında belirtmiş olduğu client'ın bundan haberdar olması adına sinyal ilk olarak server'a ordanda bağlı bulunan bütün client'lara gidecek. Id si kendi Id si olan program ise işlemi gerçekleştirecek.

Evet yukarıdaki yapı ile ilgili soruları ve sorunlar binlerce kez görmüş ve cevaplamış olabilirsiniz.Ancak Delphi XE2 ile yapmaya çalışıyorum ve doğru düzgün hiç bir örnek ve Türkçe kaynak bulamadım.

Burada kullandığım nesneler Indy Bileşen setinden TIdTcpServer ve TIdTcpClient nesneleri.Biraz araştırma yaptım ve bu nesnelerin önceki sürümlerine göre büyük bir aşama kayıt ettiğini buldum.
Bu şekilde Client'ların birbiri ile anlık olarak haberleşebilecekleri bir uygulama yapmak için,
1-) Hangi Bileşen Kullanılmalı.?
2-) Nasıl bir yapı kullanılmalı.?
3-) Kaynak bulabileceğim Siteler var mı.?
4-) Daha önce bununla ilgili çalışma yapmış arkadaşlar var ise Kaynak Kod Gönderebilir mi bana ve ya yol gösterebilir mi.?

Teşekkürler...
Kullanıcı avatarı
SimaWB
Üye
Mesajlar: 1316
Kayıt: 07 May 2009 10:42
Konum: İstanbul
İletişim:

Re: TcpServer - TcpClient - Konu Araştırması

Mesaj gönderen SimaWB »

Datasnap'ta aradığınız herşey hazır zaten. Datasnap ve callbacks şeklinde aratırsanız örnekler bulabilirsiniz. Buradan başlayabilirsiniz.
There's no place like 127.0.0.1
destiny24
Üye
Mesajlar: 131
Kayıt: 22 Tem 2010 09:42

Re: TcpServer - TcpClient - Konu Araştırması

Mesaj gönderen destiny24 »

Hocam teşekkür ederim istediğime ulaştım ancak bir sorun var 3 gündür çözemedim.

Ben bu projeyi videolarını izleyerek oturdum yeniden yaptım.Gayette güzel çalışıyor.Sonra örneği indirdim o da aynı şekilde çalışıyor.

Benim yapmış olduğum başka bir program vardı onun içine uniti ve formu ekledim ancak orada bir türlü çalıştıramadım.Aslında mantık olarak bir hata yok.Debug ederek gidiyorum herşey eksiksiz ancak gelen mesajı yazdırmak istediğimde ilk önce hata veriyordu Access Voilation şimdi bugün ise hiç tepki vermiyor.CallStack ile gittiğimde assembly kodlarını refere ediyor.

Sanki form donmuş gibi, hiç bir değişiklik yapamıyorum form açıkken.

Sorun ne olabilir ?
benim projemde kulandığım bir şey mi etkiliyor acaba .?
ayrı projede çatır çatır çalışan kodlar burada çalışmıyor.?


Evet az önceki denememde eğer bu işlemi yaptığım form Ana Form yani program açıldığında ilk çalışan form olursa sorun vermiyor ancak ben bunu başka bir form altına eklersem ve o formu çağırırsam çalışmıyor.
Neden Olabilir ?
Kullanıcı avatarı
SimaWB
Üye
Mesajlar: 1316
Kayıt: 07 May 2009 10:42
Konum: İstanbul
İletişim:

Re: TcpServer - TcpClient - Konu Araştırması

Mesaj gönderen SimaWB »

Form üzerinde kullandığınız bileşenleri bilmeden problemin kaynağını söylemesi çok zor. Ama, özellikle veri tabanı bağlantısı için form üzerinde kullandığınız bileşenler varsa bence problem bunlardan kaynaklanıyordur. Eğer varsa bunları Datamodule içine atın yada ana formun üzerinde deneyin.
There's no place like 127.0.0.1
destiny24
Üye
Mesajlar: 131
Kayıt: 22 Tem 2010 09:42

Re: TcpServer - TcpClient - Konu Araştırması

Mesaj gönderen destiny24 »

Şöyle oldu aslında ana form üzerine attım ben diğer formun üzerindeki nesneleri ancak orada da çalışmadı.
Hatta boş bir proje oluşturdum forma hiç bir şey koymadan Datasnap formunu ekledim projeye, daha sonra bir buton koyarak Datasnap formunu çağırdım ancak orada da hata verdi.Yani veritabanı nesneleri ile alakalı bir sorun olduğunu düşünmüyorum.

burada ki mantık nedir anlayabilmiş değilim.Hem verdiği hata da Access Voilation Hatası.

Deneme şansınız var mı ?
emin_as
Üye
Mesajlar: 559
Kayıt: 01 Eki 2008 10:05
Konum: izmir
İletişim:

Re: TcpServer - TcpClient - Konu Araştırması

Mesaj gönderen emin_as »

Access violation hatasının nedeni oluşturulmamış nesnenin kullanılması daha dogru ifadeyle programın yetkisi olmayan bir bellek adresine erişmeye çalışmasıyla oluşur.

Form2.Caption:='test';
Gibi bir komut eger form2 oluşturulmadıysa access violation hatası verecektir.

Form2:=TForm2.Create(Self);
Form2.Caption:='test'; --> hata vermez
Form2.Free;
Form2.Caption:='test'; --> hata verir, form2 artık geçersizdir.

Bu sadece form2 degil, delphi deki tüm nesneler için geçerlidir. Oluşturulmamış bir nesneye erişmek access violation hatası demektir.
Kullanıcı avatarı
SimaWB
Üye
Mesajlar: 1316
Kayıt: 07 May 2009 10:42
Konum: İstanbul
İletişim:

Re: TcpServer - TcpClient - Konu Araştırması

Mesaj gönderen SimaWB »

destiny24 yazdı: Deneme şansınız var mı ?
Maalesef deneme şansım yok :(
There's no place like 127.0.0.1
destiny24
Üye
Mesajlar: 131
Kayıt: 22 Tem 2010 09:42

Re: TcpServer - TcpClient - Konu Araştırması

Mesaj gönderen destiny24 »

Access Violation Hatasının hangi şartlarda oluştuğunu biliyorum, aslında beni şaşırtan da buydu.

Datasnap formu yani 2. form açılıyor butona basıyorum gönderim yapan bütün satırları geçiyor ancak ekrana yazdırma sırasında hata alıyorum.
mesela örnek'te memoLog.Lines.Add(DateTimeToStr(Now) + ': ' + s); denilmiş.Bu satırda yani aslında hata verecek en son yerde hata veriyor.
Ancak bu satırı ShowMessage(s); satırı ile değiştirdiğimde hata almadan gelen mesajı ShowMessage ile gösterebiliyorum.Showmessage penceresi memodan farklı olarak Modal olarak açılıyor acaba hata vermesinin nedeni Thread olabilir Mi.? yada modal olmayan nesneye yazmaya çalışırken ki bu editte olabilir butonda olabilir label de, hata veriyor...
aslında access violation hatasına bakacak olursak eğer burada CallBack olduğunda sanki formu bellekten siliyormuş da üzerindeki değerlere ulaşamıyormuş gibi oluyor.?
emin_as
Üye
Mesajlar: 559
Kayıt: 01 Eki 2008 10:05
Konum: izmir
İletişim:

Re: TcpServer - TcpClient - Konu Araştırması

Mesaj gönderen emin_as »

Nesnelerinin oluşturuldugunu ve geçerli olduklarını varsayarak cevap yazıyorum. VCL de thread leri kullanırken synchronize komutu ile thread in main fonksiyonunda diger çagrıları yaparsın, aksi halde kilitlemelerde sorun olur, aynı nesnelere aynı anda erişilmeye çalışılır.
Aşagıdaki dokumanda ayrıntılı bilgi var, bazı nesneler threadsafe degildir, yani dogrudan thread içinde çagıramazsın, synchronize ile birlikte kullanırsın. Memolog.lines olan komutu thread içinde bir procudure olarak tanımla mesela LogMe diye sonra synchronize(Logme) ile bu procedure u çagır, sorun çıkmaması gerekir.

http://www.podgoretsky.com/ftp/Docs/Del ... reads.html
destiny24
Üye
Mesajlar: 131
Kayıt: 22 Tem 2010 09:42

Re: TcpServer - TcpClient - Konu Araştırması

Mesaj gönderen destiny24 »

aslında daha önce thread kullanmadım delphi de ancak örnekte aşağıdaki gibi kullanılmış. ve şöyle bir durum var bu form programın ana formu olarak ayarlanırsa hiç bir sorun çıkmadan çalışıyor. başka form tarafından çağırılıp kullanılmak istendiğinde çalışmıyor fark bu.Thread ile ilgisi olabilir mi bu durumda.?

TThread.Queue(Nil,
Procedure
begin
LogMsg(s);
end
);
Cevapla