indy

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
alikus

indy

Mesaj gönderen alikus »

Arkadaşlar ben indy component leri ile dışarıdaki bir makinadan(indy client
ile ) database server 'a sorgu gonderen(indy server ile) bir program yaptım.
Söyle bir sorunum var. client lardan aynı anda sorgu gonderince "Connection
Closed Gracefully" mesajı veriyor clientler ve işlemi kesiyor. Bu sorunu nasıl
çözeriz. Client tarafında iki adet IdTcpClient kullanıyorum. Bunlardan birisini bağlantı kurmak diğerini de veri alışverişi için kulanıyorum. Bunların bağlantı portları farklı. server tarafında da iki adet IdTcpServer kullanıyorum (client teki gibi ) .Yardımlarınızı bekliyorum.
Kullanıcı avatarı
safak
Şafak EBESEK
Mesajlar: 165
Kayıt: 05 Ağu 2003 04:39
Konum: Istanbul
İletişim:

Mesaj gönderen safak »

Öncelikle iki server ve client kullanmanız için makul bir sebep olmalı. Çünkü fazladan kaynak tüketiyorsunuz.
Tek server ve client bağlantısı kullanarak sistemi çalıştırmaya çalışmanızı, doğru bir sonuç elde ettikten sonra gerçekten özel bir tasarım kriteri varsa ikincileri devereye almanızı öneririm.
"Connection Closed Gracefully" htası diğer ucun beklenmeyen şekilde bağlantısının kaybolmasından kaynaklanıyor. Idhttp bileşeninde de aynı hata ile karşılaşılıyor. Bu aslında bir hata değil, bir durum bildirimi. Temel olarak karşı tarafın bağlantıyı neden kestiğini anlamanız lazım. Eğer bu durum kontrolunuzde değilse (bir web server olabilir) bu durumda bağlantıyı yeniden kurmanız gerekecek. Fakat bu işmele nadiren karşılaşıyor olmanız lazım. Sık sık karşılaşıyorsanız programınıza göz atınız. En kolay yol olarak indy haberleşme işlemlerini try except end bloğu içerisine alarak hatanın görünmesini önleyebilirsiniz. Hata oluşması duruunda bağlantıyı yeniden kuarabilirsiniz.
alikus

iki server client kullanmamın sebebi

Mesaj gönderen alikus »

client ile servera bağlantı kurup sorgu gonderdikten sonra; server dosyayı gönderip disconnect yapması. dolayısıyla tekrar sorgu gönderemiyorum. çünkü tekrar bağlantı kurmam gerekiyordu. bunu için ikişer tane kullandım. Birisi bağlantı kurma diğeri dosya alışverişi için kullandım
Kullanıcı avatarı
safak
Şafak EBESEK
Mesajlar: 165
Kayıt: 05 Ağu 2003 04:39
Konum: Istanbul
İletişim:

Mesaj gönderen safak »

Nomal şartlar altında idTCPClient ile idTCPServer arasındanki haberleşme süreklidir. Sürekli bilgi gönderip alabilirsiniz. Bilginin serverden gönderilmesinden sonra bağlantının kesilmesinin nedenini bulmak lazım. Ben kendi uygulayabileceğim yolu aktarmak isterim. Belki sizin için de uygun olur.
Öncelikle sadece text haberleşmesi yapardım. Clien ve server arasında sanki ICQ kullanıyormuşum gibi haberleşmeye çalışırdım. Bu işlem kesintisiz geçekleştikten sonra text dışındaki öğeleri transfer etmeyi denerdim. Bunlar büyük ihtimalle serialize edilmis Streamlar olmalı. Bunun için RichText'i kuılnanrak SaveToStream, LoadFromStream ile denemelerimi yapardım. Bunu da kararlı bir şekilde geçtikten sonra dataset ya da datasetten türetilen bilgileri aktarmata çalışırdım.

Umarım zaten kullanmakta olduğunuz metodları tekrarlayarak vaktinizi almadım.

Kolay Gelsin,
alikus

Mesaj gönderen alikus »

benim yaptığım sey client ile sorgu gonderip server tarafında verileri hazırlayıp bunu stream ile gondermek

AThread.Connection.OpenWriteBuffer;
AThread.Connection.WriteStream(DataStream);
AThread.Connection.CloseWriteBuffer;
AThread.Connection.Disconnect;

son satırdaki disconnect olayından dolayı tekrar veri alıp gonderemiyorum. disconnect'i kaldırıncada veri gönderilmiyor.
Kullanıcı avatarı
safak
Şafak EBESEK
Mesajlar: 165
Kayıt: 05 Ağu 2003 04:39
Konum: Istanbul
İletişim:

Mesaj gönderen safak »

Buradaki kritik nokta disconnect den önce datanın gönderilebilmesi olmalı. Tarif ettiğiniz işlemler serverde Execute içerisinde yazılmış olmalı. Client
SizinClient.ReadStream(AStream, -1, true);
şeklinde okumalı.

Hatırladığım kadarıyla TCPIP de serverler pasif oluyorlar. Client aktif oluyor. Serverle Client den gelen isteklere cevap veriyorlar. Bu durumda client tarafındaki talebinizi de gözden geçirmeniz faydalı olabilir.

Acaba Indy TCPStreamClientServer örneğinde gözünüzden kaçan bir şey olabilir mi ?

Kolay Gelsin,
alikus

bir sorum daha olacak ilişkili bir konu

Mesaj gönderen alikus »

server dan client e stream gönderebilir. peki clientten servera stream nasıl göndeririz.
Kullanıcı avatarı
safak
Şafak EBESEK
Mesajlar: 165
Kayıt: 05 Ağu 2003 04:39
Konum: Istanbul
İletişim:

Mesaj gönderen safak »

Genelde iki bakış var.
1. Client ve server eş anlı olarak haberleşirler
2. Biri gönderir diğeri bekler sonra el sıkışırlar. Sıra kimdeyse o göndermeye başlar.

1. yolu kullanmak biraz zorluk doğurabilir.
2. yol kullanıldığında taraflardan biri, diğerine mesaj gönderir. diğeri de buna bir cevap verir. İstenirse işlemin tamamlandığının garantisi ve bir sonraki adımın hazırlığı için el sıkışma işlemi yapılır.

Çoğunlıkla Serverler Clientlardan gelen talebi cevaplarlar. Clientdan gelen talep "sana gönderdiğim su bilgileri al bir yere sakla" olabilir. serverin Execute olayı içerisinde bu işlem halledilir. Genellikler gönderilen bilginin önüne yazılan anlamlı bir kelime, bilgiyi alana ne yapacağını söyler. Bu kelimeleri ve bunları görünce yapılacak işleri tanımlamaya Protokol deniyor. Client Server haberleşmede kendi prokolünüz uygulamanız bir çok kolaylık sağlar. Neredeyse en basit durumlar haricinde bu protokol olmadan pek bir şey yapılamaz. Çünkü mesajı alan bunu ne yapacağını bilemez.

Mesaj alma ve gönderme biçimleri açısından client ve server arasında bir fark yoktur.

Indy bileşenleri Blocked modda çalışıyor. Tanı bir satırda yazılan işlemi tamamlayıp diğerine geçiyor. Asencron haberleşme gerekiyorsa iki server iki client kullanılmalı ya da nonblocked tasarlanmış komponentler kullanılmalı. Bunların yarattığı eventlerin kontrolu biraz daha fazla dikkat gerektirir. Eğer mümkünse blocked modda çalışmak çok daha rahar konrol edilebilir.
Cevapla