"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 » 11 Mar 2008 06:03

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: 3011
Kayıt: 25 Ağu 2003 11:35
Konum: İstanbul
İletişim:

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

Mesaj gönderen mkysoft » 11 Mar 2008 01:16

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 » 11 Mar 2008 04:29

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 » 13 Mar 2008 03:27

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: 30 Eyl 2007 11:02
Konum: Ankara

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

Mesaj gönderen Battosai » 13 Mar 2008 11:45

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 » 14 Mar 2008 01:17

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: 3011
Kayıt: 25 Ağu 2003 11:35
Konum: İstanbul
İletişim:

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

Mesaj gönderen mkysoft » 14 Mar 2008 04:18

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 » 15 Mar 2008 01:54

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 01:06

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

Mesaj gönderen RewriteRule » 16 Mar 2008 01:58

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
(176.65 KiB) 423 kere indirildi

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

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

Mesaj gönderen Elaman » 16 Mar 2008 05:35

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 02:47

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

Mesaj gönderen askarad » 18 Mar 2008 03:16

benim anlayamadıgım neden subelere aylık 3 ytl karsılıgı static ip alınmadıgı? :)

Kullanıcı avatarı
Commandx
Üye
Mesajlar: 144
Kayıt: 01 Oca 2008 05:34

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

Mesaj gönderen Commandx » 20 Mar 2008 12:05

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 07:36 tarihinde düzenlendi, toplamda 1 kere düzenlendi.
http://www.delphibasics.co.uk/RTL.asp?Name=DaysBetween
Zamane tickcount'u
except
ON E: Exception do
Begin
Application.MessageBox(Pchar('Can sıkıntısı '+#13+E.Message),'Hata',MBOKk+MB_ICONWARNING);
Abort;
End;
end;

Kullanıcı avatarı
freeman35
Admin
Mesajlar: 2151
Kayıt: 12 Haz 2003 03:05
Konum: merkez camii yanı

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

Mesaj gönderen freeman35 » 21 Mar 2008 04:20

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: 144
Kayıt: 01 Oca 2008 05:34

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

Mesaj gönderen Commandx » 27 Mar 2008 06:06

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
Zamane tickcount'u
except
ON E: Exception do
Begin
Application.MessageBox(Pchar('Can sıkıntısı '+#13+E.Message),'Hata',MBOKk+MB_ICONWARNING);
Abort;
End;
end;

mert_37
Üye
Mesajlar: 35
Kayıt: 13 Şub 2014 02:53

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

Mesaj gönderen mert_37 » 08 Eki 2019 05:30

UdpChat Rar Linki olu
Yenşleme imkanın varmı ?
Bugünlerde bende ugrasıyorum....Bir ip den bilgiyi okudum ama abuk subuk hatalar ve sürkli kesiliyor ne yapacağımı bilemiyorum.
Komutlar basit alma işi sadece.
Ama yok ReadTimeOut ,yok bir bakıyorsun kendi kendine durmuş çalışmaz.
Yok kilitlenir...Yaniiii ...yaniiiii....:)

Cevapla