Herkeze merhabalar.
7 yıldır delphi ile oracle veri tabanı kullanarak proje geliştiriyorum. fakat bu socket kullanmaya işim düştü. beceremedim.
yapmak istediğimi açıklıyım. bir sunucuda çalışan server exesi mevcut. ve buna ip si ile baglanıcak clientlerim olucak. baglanan client baglandıgını bildirip. server exesinden aktif durum ile bilgiler alıcak ve clientin üzerinde bunları sembolik olarak gostericek. kullanıcı client üzerinden istediği zaman bir değer göndericek server bunu karşılıyıp işliycek geri dönüş yapıcak veya yapmıcak.
belki biraz karışık oldu ama birde şunu anlatıyım. ben client den servera baglanma işini hallettim. sonra FIndyClient.Socket.WriteLn('IlkBaglanti') diye gonderip exenin üzerinden bunu karşıladığımda biliyorumki bir client bağlandı. ve eğer socketten gelen değer ='IlkBaglanti' ise cliente AContext.Connection.Socket.WriteLn(aktifBaglantilar) ile geri değer döndürüyorum. mesela server uzerındeki page controlde kactane pagecontrolvar değerini gönderiyorum. clientten bu değeri alıp pagecontrol nesnesine design time da o kadar page olusturuyorum.
sonra clientteki page control change oldukca tekrar FIndyClient.Socket.WriteLn('Page-'+IntToStr(id)) diye hangı pageye gectıgımı gonderiyorum. server üzeinden de gelen değeri şu şekilde kontrol ediyorum if Copy(recv,1,5) = 'Page-' then id := Copy(recv,6,length(recv)-5) diyerek kacıncı pagenın numarasını clientin gonderdiğini tespit ediyorum. ve bu sayfayı server uzerındekı pagecontrol nesnesinden aktif ettiriyorum.
bunları yaptım ama bence mantıkta bir yanlıslık var bu socket haberleşmesi bu şekilde değil gibime geldi. çünki bu pageyi bir kere değiştirdikten sonra yapmak istediğim bir kerelik oluyor daha sonra exenin ramde kapladıgı alan çoğalıyor 600 700 mb a kadar çıkıyor ve gelen komutu işliycek kadar buyuk yer yok gibi bir hata veriyor. sonrasında zaten socket hataları access violationlar felan geliyor.
bu konuda tecrübeli arkadaşlar varsa bana yardımcı olabilirmi bu socket nasıl kullanılır client ve server arasında nası sağlıklı bir haberleşme sağlanılabilinir. döküman , örnek proje ne olursa çok sevinirim. teşekkürler
delphi TIdTCPServer TIdTCPclient kullanımı soru.
Forum kuralları
Forum kurallarını okuyup, uyunuz!
Forum kurallarını okuyup, uyunuz!
Re: delphi TIdTCPServer TIdTCPclient kullanımı soru.
Client ile Server'ı birbirine bağlayabilip veri gönderip alabildiğinize göre, socket ile ilgili bir sorununuz yok demektir. Bana kalırsa sorununuz; uygulama için kurduğunuz mantıkta ve uygulamanın hafıza kullanımı giderek artıyor ise; create ettiğiniz nesneleri free etmiyor, hafızada ayırdığınız tahsisatı serbest bırakmıyorsunuz demektir. Sorunu socket'de değil başka yerlerde aramalısınız sanıyorum. Uygulama geliştirme anında her zaman ReportMemoryLeaksOnShutdown özelliğiniz açık olsun ne kadar minik leak'lerde olsa hepsini temizlemeye çalışın. Warning'leri dikkate alın, mümkün mertebe try..finally..end; bloklarını kullanıp finally kısmında dinamik oluşturduğunuz nesnelerinizi, tahsisatlarınızı boşaltın ve asla try..except..end; bloklarında exception'ları gizlemeyin.
Re: delphi TIdTCPServer TIdTCPclient kullanımı soru.
Tuğrul hocama %100 katılmakla beraber, senin için küçük bir örnek hazırladım. Elimin altında Delphi7 vardı.
(Yadigar) Senin için bir başlangıç noktası olacaktır. Temel seviyede socket bağlantı işlemi ve veri gönderimi için işini görecektir.



Re: delphi TIdTCPServer TIdTCPclient kullanımı soru.
Cevaplarınız için teşekkür ederim. bahsettiğiniz hususlara program içerisinde dikkat ediyorum. rami doldurma tarafı server exesinde oluşuyor benim dinamik nesneleri create ettiğim yer client üzerinde. sanki socket kullanım mantığında bir yanlışlık var gibime geldi. ama onun cevabınıda G.Arkas ın verdiği örnekte bulacağıma inanıyorum inceliycem hemen. teşekkürler tekrardan 

Re: delphi TIdTCPServer TIdTCPclient kullanımı soru.
Kullandığım yapıda bu şekilde bir önad ve seperatorle değeri birleştirip gönderiyorum server tarafındada bunu parse edip değeri kullanıyorum. başka bi yerlerde problemim var bakıcam artık yapıcak bişey yok teşekkür ederim ilgilendiğiniz için.