İndy "TcpServer.WriteLn" eksik sting gönderiyor!

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
kahraman1285
Üye
Mesajlar: 360
Kayıt: 10 Nis 2006 09:07

İndy "TcpServer.WriteLn" eksik sting gönderiyor!

Mesaj gönderen kahraman1285 »

Mrb.

İndy Tcpserver ile Client'e

Kod: Tümünü seç

TcpServer
Athread.connection.WriteLn( Bilgi ) ;
metoduyla bilgi gönderiyorum.Bu sting tpindeki bilgi en az 2.000 en fazla 10.000 karakter uzunluğunda ;

Fakat bazen bu bilginin bir kısmı Client'a eksik olarak gidiyor özellikle bilginin ilk kısmı gitmiyor.

Yaptığım araştırmada Client ve Server İndy

Kod: Tümünü seç

RecvBufferSize 32168 byte
SendBufferSize  32768 byte 
olarak gösteriyor.Ben bu stringlerden Xml dosyası oluşturarak kullanıyorum xml dosyalarının toplam boyutu yaklaşık 10 kb .

Bu noktada neden bu problemle karşılaştığımı anlayamadım.
aynı Tcp serverdan bide buffer işlemide yapıyorum bununla bir ilgisi olabilir mi?

Buffer yolu ile iletişimi ayrı bir Tcpserver kullanarak mı yapmalıyım?
SendBufferSize 32768 byte olmasına rağmen 5.000-10.000 karakterden oluşan bir string ifade 32768 byte sınırını aşar mı?

teşekkürler...
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Mesaj gönderen mrmarman »

Uygulamaya çalıştığın kodu yazarsan daha anlaşılır olur. Ayrıca hangi Indy Bileşen Setini kullanıyorsun ? Indy 10, 9, 8 hangisi ?
Resim
Resim ....Resim
kahraman1285
Üye
Mesajlar: 360
Kayıt: 10 Nis 2006 09:07

Mesaj gönderen kahraman1285 »

Indy 9 setini kullanıyorum...(Delphi 7)

TcpClient ilk bağlandığında Server bu client için bit pointer atayıp onu ThrdManagerDefault nesnesi sayesinde bir listeye atıyor.Şöyleki:

Kod: Tümünü seç

 
type
  PClient   = ^TClient;
  TClient   = record  // Object holding data of client (see events)
                DNS         : String[25];   { Hostname }
                UyeAdi      :string[25];
                Thread      : Pointer;               { Pointer to thread }
              end;

var
Kullaniciadi,Sifre,GelenMesaj:String;
NewClient: PClient;

GetMem(NewClient, SizeOf(TClient));//ramde client için bi yer acılıyo
        NewClient.DNS         :=AThread.Connection.LocalName; //clientın bilgileri alınıyor
        NewClient.UyeAdi      :=Kullaniciadi;
        NewClient.Thread      :=AThread;
bundan sonra server clienta kısa mesajlar göndermek için:

Kod: Tümünü seç

type
  TCommBlock = record   // the Communication Block used in both parts (Server+Client)
                 Command,
                 MyUserName,        // the sender of the message
                 Msg,              // the message itself
                 ReceiverName: string[100];  // name of receiver
               end;


function TAnaSayfa.UyeleriBilgilendir(Komut,Mesaj: string):boolean;
var
 ActClient, RecClient: PClient;
 CommBlock, NewCommBlock: TCommBlock;
 RecThread: TIdPeerThread;
 i: Integer;
begin
CommBlock.Command:=Komut;
CommBlock.Msg:=Mesaj ;
CommBlock.MyUserName:='SERVER';

NewCommBlock := CommBlock;

  with Clients.LockList do
   try
     for i := 0 to Count-1 do  // iterate through client-list
	     begin
        RecClient := Items[i];           // get client-object
        RecThread := RecClient.Thread;     // get client-thread out of it
        RecThread.Connection.WriteBuffer(NewCommBlock, SizeOf(NewCommBlock), True);  // send the stuff
       end;
   finally
     Clients.UnlockList;
   end;

end;
fonksiyonunu kullanarak
-Yeni üye girdi
-Yeni ürün geldi
....vs kısa uyarıları clienta gönderiyor.Clientta bu uyarılara göre kendini güncellemek için serverdan yeni bilgileri ReadLn ve Writeln metoduyla alıyor .

Buraya kadar herşey normal esas sorun aynı server ile Athread.Connection.WriteLn metodunda gönderdiğim stringin karakter sayısı 2000 sayısının üzerine çıktığında çoğunlukla stringin ilk kısmı clienta gidemiyor.

Ama Receive Buffer size 32768 byte ayarlı 2.000 - 5.000 karakterden oluşan string değişken harddiskde 10-12 kb tutuyor ama server bunu WriteLn metoduyla karşıya eksik olarak gönderiyor.

Bu noktada ben iki farklı Indy TcpServer mı kullanmalıyım yoksa tek seferde gönderdiğim string karakter sayısınımı azaltmalıyım.Yada yaptığım bir yanlış mı var?

Athread.Connection.WriteLn metodunun kapasitesinde bir sınırlama mı var.Help de herhangibir kısıtlama belirtmemiş...

Eğer iki adet server nesnesi kullanırsam program daha mı yavaş çalışır?

Teşekkürler....
Cevapla