"Indy Socket" lütfen okuyun...

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
Elaman
Üye
Mesajlar: 7
Kayıt: 10 Mar 2008 06:22

"Indy Socket" lütfen okuyun...

Mesaj gönderen Elaman »

Merhaba arkadaşlar;

Delphi ya da CPPB kullanarak bir stok programı yapmak istiyorum. İkisini de kendi çapımda kullanabiliyorum. Aslında istediğim programı C++ builderin TServerSocket ve TClientSocket socket componenti ile yapmıştım. Fakat geliştirme kararı alınca sorunlar yaşamaya başladım. Daha iyi ne olabilir diye biraz araştırdım ve indy kullanmaya karar verdim.

İndy ile bir çok deneme yapmış olamama rağmen takıldığım nokta da bir türlü ilerleme kat edemedim. Aşağıda yazdığım konuda yardımlarınızı bekliyorum.

Zaten bu program 3 PC arasında kullanılacak. 2'si bayi birisi fabrika. Ve Fabrika olan server'ın WAN IP si var. Ama Clientler LAN IP'den nete çıkıyor. Bu yüzden Client'ler Servera bağlanabiliyorlar ama Server Clientlere bağlantı kuramıyor. Zaten LAN, WAN, Router, ADSL Modem derken açılan port sayısı ile birlikte sorun da artıyor. Sorunum şu ki ben öyle yaptığım program çok fazla port açsın vs istemiyorum.

Programımı bir Client ve bir de Server olarak tasarladım. Server fabrikada çalışacak Clientin üzerinde IdTCPClient1 serverda ise IdTCPServer1 var.

Programın çalışması ve işlevleri ile ilgili bir sorunum yok. Hepsi hazır gibi. Ama ben Client ve Serverın arasındaki bağlantıyı kurmada sorun yaşıyorum. Asla stabilleştiremedim. Şöyle ki server tarafı bir ürünü stoklardan sildiğinde bunu Client'lere bildirmesi gerekiyor mesela ama IdTCPServer1 kendisine IdTCPClient1'den bir comut gelmeden ona yanıt veremiyor.

Ya da Server ve client arasında chat yapılacağında Serverın Client'e birşey yazabilmesi için illaki Clientten bir yanıt gelmiş olması ve serverında bunu birkere cevaplaması ve sonra tekrar clientin yanıtlaması yani sıralı olması gerekiyor. Chat server tarafından başlatılamadığı gibi bir tarafın ard arda mesaj yazması da mümkün olmuyor.

TServerSocket ve TClientSocket ile bunu başarmıştım. Yani TClientSocket, TServerSocket'e bir komut yollamamış olsa da TServerSocket, TClientSocket'e istediği kadar komut gönderebiliyordu.

indy'de bana bunu gösterecek hiç bir örnek bulamadım. Öğrenmek istediğim sadece şu: indy tcp serverdan indy tcp client'e clientten komut gelmemiş olmasına rağmen socket componentlerindeki gibi dilediğimiz sayıda komut gönderemezmiyiz ?

Biliyorum çok karışık oldu ama mazur görün saatlerdir kasıyorum kafam çorba oldu umarım anlaşılabilmişimdir. Okuyan ve yardımcı olacak arkadaşlara şimdiden teşekkürler...
mkysoft
Kıdemli Üye
Mesajlar: 3103
Kayıt: 26 Ağu 2003 12:35
Konum: Berlin
İletişim:

Re: "Indy Socket" lütfen okuyun...

Mesaj gönderen mkysoft »

Bu sistemin çalışması için sürekli bağlı olması lazım server/client birbirine. Server IP sabit olduğu için mecburen önce cientler connection oluşturması lazım.
Sana öncelikli tavsiyem programı firebird,mysql gibi çok kullanıcılı bir veri tabanı üzerinden yapman. Böylece bir çok sıkıntın otomatik olarak çözülecek. Sürekli bağlantı gerekmeyecek.
Mevcut sistemler bunu çözmek istiyorsan;
Client ve Server programına hem serversoket hem client soket ekle. Karşılıklı olarak ihtiyaç olduğunda sever nesnelerini kullan.Yani veri göndermek için server nesnesi, almak için client nesnesi kullan. 2 ayrı portun olması gerecek, veri gidiş ve geliş. Clientlar belirli aralıklarla interneti kontrol etsin ve servera ipsini iletsin. Server sürekli güncel IP listesini tutsun.

Kolay gelsin.
Elaman
Üye
Mesajlar: 7
Kayıt: 10 Mar 2008 06:22

Re: "Indy Socket" lütfen okuyun...

Mesaj gönderen Elaman »

mkysoft yazdı:Bu sistemin çalışması için sürekli bağlı olması lazım server/client birbirine. Server IP sabit olduğu için mecburen önce cientler connection oluşturması lazım.
Sana öncelikli tavsiyem programı firebird,mysql gibi çok kullanıcılı bir veri tabanı üzerinden yapman. Böylece bir çok sıkıntın otomatik olarak çözülecek. Sürekli bağlantı gerekmeyecek.
Mevcut sistemler bunu çözmek istiyorsan;
Client ve Server programına hem serversoket hem client soket ekle. Karşılıklı olarak ihtiyaç olduğunda sever nesnelerini kullan.Yani veri göndermek için server nesnesi, almak için client nesnesi kullan. 2 ayrı portun olması gerecek, veri gidiş ve geliş. Clientlar belirli aralıklarla interneti kontrol etsin ve servera ipsini iletsin. Server sürekli güncel IP listesini tutsun.

Kolay gelsin.
Tavsiyelerin için teşekkürler mkysoft. Veri tabanı olarak MySql kullandırıyorum. Ve evet sabah bayi açıldımı client servera bağlanacak ve sürekli de bağlı olacak. Ondisconnect olayına gerekli koldarı yazdım herhangi bir disconned durumunda program yeniden bağlanmayı deniyor vs. Aksi taktirde serverdan gelen güncelleme ve chat mesajlarını alamaz. Artı olarak evet clientler servera bağlanıyorlar.

Fakat sorun şu ki Server Clientlere bağlanamıyor çünkü Clientlerin WAN IP Adresleri yok yani nete router arkasından çıkış yapıyorlar. Bu yüzden forumumuza sorma ihtiyacı duydum. Yani ben işe ServerSocket ve ClientSocket'i hiç karıştırmak istemiyordum. Şimdi onların güvenliğini sağlamak vs derken iş büyüyor. Ve de indy'den client komut yollasın ServerSocket'den Server yollasın işlem karmakarışık oluyor. Bu yüzden tüm bu işlemleri indy ile yaptırabilirmiyim öğrenmek istedim. Fakat verdiğin yanıta bakacak olursak sanıyorum bu mümkün değil gibi. :(... Acaba diğer arkadaşlar da aynı mı düşünüyorlar ?

Yoksa indyTcpServer ile, ServerSocket'in yaptığı gibi, Clientinden bir komut gelmemiş olmasına rağmen Serverdan Cliente doğru sayısız komut gönderebilirmiyiz. Teşekkürler...
Elaman
Üye
Mesajlar: 7
Kayıt: 10 Mar 2008 06:22

Re: "Indy Socket" lütfen okuyun...

Mesaj gönderen Elaman »

Hımmm bu konuda paylaşmak istediği başka bir bilgisi olan kimse yok mu acaba ?
Kullanıcı avatarı
Battosai
Üye
Mesajlar: 1316
Kayıt: 01 Eki 2007 12:02
Konum: Ankara

Re: "Indy Socket" lütfen okuyun...

Mesaj gönderen Battosai »

Veritabanı uygulaması için Indy niye ki?...Stok silindiğinde client haberdar olsun demişsin...nasıl bir haber olacak...ben silindim mi diyecek?. Mesele stok silindiğinde client da açık bir tablo varsa o tablo güncellensin istiyorsun demi... :twisted: Bu meseleyi bu şekilde yaparsan zahmetli ve performans düşürücü olacaktır....Server-Client yani esasında çoklu kullanıcılı sistemde veritabanındaki örneğin bir stok üzerinden işlem yapacaksın...işlem yapmadan önce stoku kontrol ettirirsin ...silme veya satış kodundan sonrada bir kotrol kodu yollarsın işlem tamam mı diye....ayrıca çoklu kullanıcılı sistemde her işlemden önce tablo güncellenmeli, yani devamlı Table1.Active şeklinde bir yapı değilde işlem sırasında tavsiyem Query ile tabloya sorgu gönderip neticeyi almandir...Mesajlaşma olayında indy kullanabilirsin tabi...Ayrıca indy client'ın nerden bağladığına pek bakmaz IP sini alıyorsa bağlantıyı sağlar....
Elaman
Üye
Mesajlar: 7
Kayıt: 10 Mar 2008 06:22

Re: "Indy Socket" lütfen okuyun...

Mesaj gönderen Elaman »

Ben zaten programın kalan her kısmını yazdım sorunsuz çalışıyor. Sorunum sadece indy. Server ve Client Socket nesnelerinde yaptığım gibi serverdan cliente mesaj vs yollatamıyorum tek derdim bu. Diğer konuları arkadaşa cevaben yazmıştım. Ne veri tabanı nede başka bir kısmı ile ilgili problemim kalmadı tek derdim. Indy Serverın cliente birşey yazması için klientten indye bir şey yazılmış olması gerekiyor. Bu da beni mahfediyor.

Yani Client bunu yollamadan: IdTCPClient1->Socket->WriteLn("Komut");
Server bunu Cliente yollayamıyor: AContext->Connection->Socket->WriteLn("Komut");

-------------------------------------

Öncelikle illa client Bunu gönderecek: IdTCPClient1->Socket->WriteLn("Komut");
Sonra server onu bununla alacak: AContext->Connection->Socket->ReadLn();
Ve Cliente bunu gönderecek: AContext->Connection->Socket->WriteLn("Komut");
Client de geleni bununla alacak: IdTCPClient1->Socket->ReadLn();

Benim istediğim bu sıralamanın dışına çıkmak. Bu sıralama ile nasıl bir chat yapılabilir ki. Server Client'e ard arda 2 kere birşeyler yazamayacak mı ? Server ve ClientSocket nesnelerinde bile bu tür bir sorun söz konusu değilken indy gibi yetenekli bir componentin bu talebe yanıt verememesi beni çok şaşırtıyor.
mkysoft
Kıdemli Üye
Mesajlar: 3103
Kayıt: 26 Ağu 2003 12:35
Konum: Berlin
İletişim:

Re: "Indy Socket" lütfen okuyun...

Mesaj gönderen mkysoft »

router üzerinde virtula server yaparak her client için ayrı port atayabilirsin, böylece server client makinalardaki server nesnesine bağlanabilir.
Elaman
Üye
Mesajlar: 7
Kayıt: 10 Mar 2008 06:22

Re: "Indy Socket" lütfen okuyun...

Mesaj gönderen Elaman »

mkysoft yazdı:router üzerinde virtula server yaparak her client için ayrı port atayabilirsin, böylece server client makinalardaki server nesnesine bağlanabilir.
Sabırla sunduğunuz alternatifler için teşekkür ederim. Evet çeşitli alternatifler denenebilir lakin benim sorunum alternatifler çözümlerle çözülecek gibi değil. Yarın birgün karstaki yeni bir bayi ağa dahil edildiğinde karsa gidip oradaki cliente ayar yapmak zorunda kalmak istemiyorum. Yani kulağımı tersten göstermek istemiyorum. Yoksa bu işi ClientSocket ve ServerSocket nesneleriyle zaten yaptım.

Tek derdim bundan bir önceki mesajımda yazan olay sanıyorum onunda mantıklı bir yanıtı yok ya da biz bilmiyoruz. Yani birisi çıkıpta bu componentlerle bu imkansız bunu yapamazsın dese ve bu doğru olsa en azından daha çok kasıp ServerSocket ve ClientSocket nesneleri üzerine programın kalan evrimini tamamlayacağım. Ya da alternatif bir component var mı acaba bunu yapabilecek diye düşüneceğim.
RewriteRule
Üye
Mesajlar: 43
Kayıt: 01 Eki 2007 02:06

Re: "Indy Socket" lütfen okuyun...

Mesaj gönderen RewriteRule »

Ekte sunduğum dosyaları incelersen çözümü bulacaksın. Ben bu yolla çözmüştüm Server'dan Client'a mesaj göndermeyi. Dökümanlar ingilizce, nerden derlediğimi tam hatırlamıyorum.
Dosya ekleri
Anlatim.rar
(175.96 KiB) 603 kere indirildi
Elaman
Üye
Mesajlar: 7
Kayıt: 10 Mar 2008 06:22

Re: "Indy Socket" lütfen okuyun...

Mesaj gönderen Elaman »

RewriteRule yazdı:Ekte sunduğum dosyaları incelersen çözümü bulacaksın. Ben bu yolla çözmüştüm Server'dan Client'a mesaj göndermeyi. Dökümanlar ingilizce, nerden derlediğimi tam hatırlamıyorum.
Teşekkürler dostum.

Yararlı bir kaynağa benziyor. Hemen indirip inceliyorum. Tekrar teşekkürler...
askarad
Üye
Mesajlar: 65
Kayıt: 02 Eki 2007 03:47

Re: "Indy Socket" lütfen okuyun...

Mesaj gönderen askarad »

benim anlayamadıgım neden subelere aylık 3 ytl karsılıgı static ip alınmadıgı? :)
Kullanıcı avatarı
Commandx
Üye
Mesajlar: 181
Kayıt: 01 Oca 2008 05:34

Re: "Indy Socket" lütfen okuyun...

Mesaj gönderen Commandx »

udp socket chat sistemleri için en uygun bulduğum bileşendir
UDP server socket udp client socket veya UDP socket ağ trafiği üzerine servere hiç bir yük bindirmez
TCP server/client socketlerde bir sorun var , sorun şu
birden fazla tcp socketler servere bağlandığında server ve client taraflarında şişme meydana gelip 2-3 saniyeliğine kilitleniyor
Döngü kullanıldığı haldede durum yine aynı malesef, bunun nedeni TCP socketler gönderdikleri veriyi takip etmesi , yani clientten giden mesajın servera ulaşmış olduğunu kontrol etmesi yüzünden oluyor
UDP socketlerde böyle bir durum söz konusu değil, çünkü UDP socket verinin servere ulaşıp ulaşmadığıyla ilgilenmez
sadece runtime de anında veriyi gönderir, giden veri udp server tarafından açıksa alınır ve anında işlenir, kapalıysa alınmaz veri kaybolur gider
Bence En iyiside budur, geri bildirim olayı yüzünden birden fazla TCP socketler kullanıldığında dezavantaj oluyor...
Evet tamam veri niye kaybolsun diyenler olacak ama soket komponentlerini de adam gibi yapsınlar bari.
Eğer UDP socketlerde fazlalaşırsa mesela atıyorum Clientlerin sayısı 150-200 ü geçince başka clientin gönderdiği mesaj başka clientin gönderdiği mesajlarla karışabilir nedeni ethernet kartının cevap verme süresi.
En son Commandx tarafından 09 Eki 2019 08:36 tarihinde düzenlendi, toplamda 1 kere düzenlendi.
http://www.delphibasics.co.uk/RTL.asp?Name=DaysBetween
http://www.neonhaber.com/Static/mega-co ... index.html
www.delphican.con
Function PARSE( text, ilk, son:String ): String; //
begin
Delete(Text, 1, pos(ilk, Text) + Length(ilk)-1);
Result := Copy(Text, 1, Pos(Son, Text)-1);
end;
Kullanıcı avatarı
freeman35
Admin
Mesajlar: 2356
Kayıt: 12 Haz 2003 04:05
Konum: merkez camii yanı

Re: "Indy Socket" lütfen okuyun...

Mesaj gönderen freeman35 »

Sen herşeyi hallettim demişsin am aben genede fikrimi söyliyeyim :) Ben herzaman bu tip işler için remote desktop kullanma taraftarıyım. Aradaki bağlantılarla uğraşmaya gerek yok, mikisoft bunu zaten yapıyor :) üstelik arada veri kaybı yok çünkü sadece görüntü gidiyor.Chat vs gibi işlemlerde herşey server üzerinde olduğundan WAN yada LAN üzerinde bilgi transferi olmuyor.
Indy kullandım, şöyleki: Serverda Alias ları ve diğer bazı işlemleri yaptırmak için kullanıyorum. Her application da bir server ve birde client componentın olmalı. Client ana makinaya(server makina yerine Ana diyelim Componentla karışmasın) bağlanmalı. zaten mantıkende böyle olması gerek. Client ana makina üserindeki Server component ına bağlandıktan sonra Client ın IP si bulunmuş olur, akebinde ana makina üzerindeki client component ı ile Client makinadaki server componentına bağlanılır. tabi burada şöyle bir mantık olmalı. Ana makinadaki server compoent ına 1 den fazla client bağlınacağı için, belli bir port aralığı verilmesi gerekir. Portu aynı anda sadece 1 kişi kullanabilir. Bu yüzden mantıklı olan şu olur bence, bir aralık verilir, yani 1300-1310 arası pot aralığı verilip 0 adert kadar. Client sırayla buna bağlanmaya çalışır, 1300 bağlanamadı 1301 dener, 10 tanesinede bağlanamadı server meşgul tekrar deneyin mesajı verilir. Client tarafında böyle bir sorun olmaz çünkü client a sadece server bağlanıcak. Gerçi bu hayal gücüne bağlı server üzerinden client lar birbirlerinede bağlanıcaklarsa server a bir port tahsis edilip gene 10 port ta client üzerindeki server component ına ayrılabilinir. Bu port lar ın yönlendirme ve Firewall işlemleride yapılmalı tabiki
Öncelikle illa client Bunu gönderecek: IdTCPClient1->Socket->WriteLn("Komut");
Sonra server onu bununla alacak: AContext->Connection->Socket->ReadLn();
Ve Cliente bunu gönderecek: AContext->Connection->Socket->WriteLn("Komut");
Client de geleni bununla alacak: IdTCPClient1->Socket->ReadLn();
2 taraftan birisi ilk harekette bulunmalı tabiki. bunda en mantıklı kısım client ın ilk hareketi yapması. Sebebi ise client ın IP si sabit olmaya bilir. Server Client IP lerini bilmiyor nasıl bağlanıcak ? diyelimki serverda IP listesi var, sürekli bunları kısır bi döngü içinde kotrol edicek ki buda ana makinaya gereksiz bir yük oluşturacak. Ayrıca port larla uğraşmak teoride çok basit gibi olsada uygulamada sistemi kastırmada üzerine yoktur :)

Not: Forum kurallarını okumanı öneririm, Lütfen okuyun neden cevap yok gibi mesajlar yazmak hoş değil.
Kolay gele
ZAGOR TENAY TÜRK'tür... TÜRK kalacak...
Zoru başarırım, İmkansız zaman alır
FreeMan 35.5

Soru sormaya üşenmiyorsan, sorunun çözümünü yazmaya da üşenme !!!
Kullanıcı avatarı
Commandx
Üye
Mesajlar: 181
Kayıt: 01 Oca 2008 05:34

Re: "Indy Socket" lütfen okuyun...

Mesaj gönderen Commandx »

ben şöyle bir harika örnek buldum zarko gajic
UDP socket harika birşey
ağ içinde hiç kimsenin IP sini bilmek gibi bir dert kalmıyor
D7 nin kendi komponentleri ile işi çözmüş
ağ içine udp sinyalleri yayıyor, uygun bulan socketler sinyalleri yakalayıp
paketin geldiği adresi çözüyor oraya bağlanıyor
size yapmak gereken sadece butona tıklamak kullanıcıları seçmek
http://rapidshare.com/files/102797618/UDPChat.rar
http://www.delphibasics.co.uk/RTL.asp?Name=DaysBetween
http://www.neonhaber.com/Static/mega-co ... index.html
www.delphican.con
Function PARSE( text, ilk, son:String ): String; //
begin
Delete(Text, 1, pos(ilk, Text) + Length(ilk)-1);
Result := Copy(Text, 1, Pos(Son, Text)-1);
end;
Cevapla