Tcp server hakkında.

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
aegean
Üye
Mesajlar: 41
Kayıt: 24 Tem 2019 09:32

Re: Tcp server hakkında.

Mesaj gönderen aegean »

Hocam önecelikle cevabınız için tesekkürler;
alınan verilen butun stringler aslında UTF8 xml dosyaları fazla buyuk değiller ama her türlü haberlesme için bir xml standarlları var hatta daha baska bir yerde bunun için xsd ile validasyon konususunu da sormuştum ama sonra ben oturup butun xml komutlarını kapsayan bir functıon listesi yazıp onu o sekilde astım. aslında banım bir numaralı sorunum baglantı karsı taraftan kopartılınca delphinin (seattle) standar socketserver i baglantının kesildiğini algılayamıyor ve List out of Bound diyerek connection numarası ile hata uretiyor bir turlu bu hatayı karsılayıp ta o baglantı numarasını listeden cıkar diyemedim veya ben bulamadım. Cunku okudugum kaynaklardan hiç birinde bu duzey kontrıollerin nasıl olacaği ile bilgiye ulasamadım sonra Indy server ile denedim ilginc o baglantı gittğini anlıyor ve onun baglantı harasını konrtol edebildim gel gor ki simdi de cevap vermeye kalkınca cevap genderemiyorum. Daha sonra ben de farklı port acmak yerine karsı programın bir baska ozellği ile aynı listenir portta her cihaz için baska client baglantısı yapılmasını denedim programı yeniden duzenledim ve her client baglantısını remote port numarası ile program içinde takip ederik onu da basardım ve karsıya cevap da veriyor ama bu Indy ile değil Tserversocket ile yaptım. Hadee simdi yine baglantı kopunca list out of boud hatasına kavustum bu demek oluyor ki bu component birden fazla baglantıyı yönetemiyor cunku baglantı 1 iken nasıl baglantının kesildiginin bir onemi yok Onclientclose calısıyor ama 2 ve ya 3 baglanatıda onclientclose ölü ne yapacagımı sasırdım bun kontrol edecek bir yontem varmı bana yardımcı olabilcek bir arkadas varmı. Yahu yanarın yanarım da 6000 satır a yakın programı yazdım 3 5 hatta 8 cihazı comportlarada kontrol ettiriyorum programın diğer kısımları tamam calsıyor bir TCP/IP port basıma bela oldu 2 haftadır onunla ugrasıyorum lütfen yardım nasıl bir hata yaptıgımı da bulamadım ki cevap arayayım bu programı herkes Java ile yazmıs daha once ben kalkıp delhi ile yazmayı denedim basıma bela oldu resmen ....
Kullanıcı avatarı
freeman35
Admin
Mesajlar: 2357
Kayıt: 12 Haz 2003 04:05
Konum: merkez camii yanı

Re: Tcp server hakkında.

Mesaj gönderen freeman35 »

utf8 işlemsırasın da önem arzediyor. xml utf8 diyorsun, bunu utf8 alıp ansistring e çevirip işlemlerini yapıp, tekrar utf8 olarak kaydedebilirsin. Burda tipi bilmem daha önemli. delphiideleri xe den sonrası yanılmıyorsam, utf8 default kullanılan string tipi oldu gibi.
indy opensource ve sürekli geliştirilen bir component seti. diğeri ise her deplhi sürümünde ne ekledilerse.
Daha önce basit chat demos sunu incele dememdeki amaç, port ların, server ve client ların nasıl kullanıldığına ait temel kullanım şeklini incelemen içindi.
Bir port için bir server ve bir client gerekir. Uygulamada, gelen mesajı alabilmek için bir tcpserver, mesajıda göndermek için tcpclient olması gerekir.
Çalışılan makina da, bir porta ancak bir bağlantı yapılabilinir. diyelim 666 nolu portu açtın, bu portu kapatana kadar (nasılı farketmez timeout vs) o makinada kullanamazsın. O yüzden askeriyedeki mantık uygulanır, kullanmıyorsan söndür.
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 !!!
aegean
Üye
Mesajlar: 41
Kayıt: 24 Tem 2019 09:32

Re: Tcp server hakkında.

Mesaj gönderen aegean »

Hocam tekrar tesekkürler. İşin icine indy girince aptal durumlarla karsılastım malesef ama tam anlamadıgım nokta su, simple server yani delphinin kendi verdiği komponent (Tserversocket) ayrıca baska bir client acmaya gerek olmadan baglanan client in portuna cevap veriyor gibi gözüyor. Yalnıs anladıysam lutfen uyarın, yani simdi indy kullanıca aynı programda cevap için bir de Idclient componenti ekleyip ona da benim listenir e baglanan karsı progamın remote port nosunu alıp onunla dinleme portuna baglanıp cevapları oradan mi gondermem gerekecek ? Eğer söylediğinizi dogru anladıysam servere baglanacak her client baglantı için ona cevap verecek bir client ile karsı programa baglantı mı olusturmam gerek? Biraz daha acıklarsanız onu da seve seve denerim. Veya söyle de sorabilirim eğer tavsiye edebileceğiniz gorece kullanması kolay ama cok daha saglam calısacak ucretli baska component varsa onu da deneyip satın alabilirim aslında her turlu oneriye açıgım su noktada.

Bu arada kullanmıyorsan sondur anahtarı benim elimde değil bana baglanıp ta bana is gonderen uygulama da. işi bitirip de bana bye diyene kadar benim baglantıyı canlı tutmam gerek tabi baska sebeple baglantı kesilirse o yeniden baglanıyor ama o arada benim listenir her an baglantıya hazır beklemesi gerek ve bu makina bazen 1 hafta bazen 1 ay kapanmadan calısıyor ve defalarca baglantıya da hazır olmalı o yuzden lambayı ben sonduremiyorum bu cihazda her zaman aynı uygulama bana baglanmayacak baska uygulamalar da var onların bazıları kapat diyor bazıları sadece fisi cekiyor. Cok fazla soru sordum ve anlattım biliyorum ama dediğim gibi bütün önerilerinizi deniyorum ve sizlerin oneride bulunabilması için sorunu tam anlatmaya calısıyorum. İyi günler iyi calışmalar dilerim.
Kullanıcı avatarı
freeman35
Admin
Mesajlar: 2357
Kayıt: 12 Haz 2003 04:05
Konum: merkez camii yanı

Re: Tcp server hakkında.

Mesaj gönderen freeman35 »

Soru sorulması için bu formu açtık, ve hala açık tutuyoruz. Mustafa'dan Allah razı olsun.
Soru sormak mesele değil, ama soruyu teknik detaylarla sorman gerek ki cevap bulasın. Herkesin kafasında kendi işleri var vs vs.
İlk paragrafından anladığım, chat demosuna hala bakmamışsın, incelememişsin, ikinci paragraftaysa her şeyi deniyorum demişsin!!!
Ben indy ile haberleşme işini, 20 yıl belki daha önce kullanmıştım, ve bunu da chat demosunu inceleyerek çözmüştüm. Ve o zamanlar cevap alabileceğim kaynaklarda oldukça azdı.
Programın ne ile ilgilidir bilmem, açıkçası merakta etmiyorum, sırda olabilir. Yazdıklarım da yönlendirmeye çalışmak, farklı açılardan fikir üretmeyi sağlamak.
İlk paragrafında yazdığın doğru, yani her TClient, karşıda ancak bir Tserver a bağlanabilir. Sen tek component görebilirsin, koduna bakarsan, runtime da kendisi bir listeye create ediyordur. Bu yüzden ben hep class ları öğrenin diyorum. ctrl + LeftClick ile ide den o function yada procedure e geçebilirsiniz, açılan kodları, giden parametreleri inceleyin, satır satır kodu kafanızda kendiniz çalıştırın.

"(Tserversocket) ayrıca baska bir client acmaya gerek olmadan baglanan client in portuna cevap veriyor gibi "
"gibi" demişsin bu kadar elzem olan bir şeyi neden hiç incelemedin?
Muhtemelen, ilgili yordam, atıyorum, text gönder dediğinde, runtime da bir class create edip, bağlanıp mesajı gönderip, disconnect olup kendini free liyordur. sadece fikir yürütüyorum. Çünkü başka şansı yok.

indy chat demosunu aç, ve o demo ile bağlantı kurup, debug edip mesaj gönderme vs işlerini önce bir dene. Yani tüm projenin içinde uğraşma. Önce basitçe bir çöz. Bakmadım, Muhtemelende delphi ile gelenlerinde demosu vardır. yanılmıyorsam linkler bölümüne bir link eklemiştim. yeni sürümlerde demo ları github üzerine ekliyorlar.

Yazdıklarımı fırça atmak olarak algılama, yaptıklarının yada yapamadıklarının bana hiç zararı yok, neden beni rahatsız etsin? cevap vermezdim yada vermem olur biter. Konulara bu şekilde yaklaşın. Ayrıca ben kişiye değilde genele yazmaya çalışıyorum. sonuçta forumda aramalarda çıkıyor, google aramalarında da.
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 !!!
aegean
Üye
Mesajlar: 41
Kayıt: 24 Tem 2019 09:32

Re: Tcp server hakkında.

Mesaj gönderen aegean »

Hiçbir zaman bana bilgi veren insanlara fırca attı gözüyle bakmadım hocam ne münasebet, bana bir kelime yazıpta yol gostermeye calısan herkesden de Allah razı olsun. Evet chat demosuna bakmadım dogru bundan sonra onlara bakacağim. Elbette ben bir problemin cozumu için akıs olusturmada sorun pek yasamıyorum ama bunu iyibir yol ile program diline dönüştürürken sorunlar yasayabiliyorum malum bu iste hedefe giden cok yol oluyor. Benim gibi kara ekran doneminden gelipde class lar ile program yazmaya donmek gercekten biraz zaman alıyor anlama güçlüğü cekiyorum. dedim ya ben aslında kara ekran insanıyım ilk programımı da Cobol da yazdım sonra yıllarca da dbase clipper ile proje yaptım yani ben biraz dınazor takımındanım soru soraraken de hatalı bir sey yazdıysam kusra bakmayın evet bundan sonra o demolara bakayım...Tesekkürler, iyi gunler iyi calsımalar dilerim.
aegean
Üye
Mesajlar: 41
Kayıt: 24 Tem 2019 09:32

Re: Tcp server hakkında.

Mesaj gönderen aegean »

Merhaba arkadaslar,
ben bayagı ugrastım tabii thread kontrolü ile bu server işini zaten çözmem gerekli oldugunu biliyorum ama benim gibi olaya yeni girenlerin benim yasadığım sorunları ve sıkıntıları yasaması ihtimaline karsı (konu hakkında bilgi sahibi olanları sözüm yok) nasıl cözdüğümü bari yazayım dedim
öncelikle bir exe içerisinde birden cok port ile Indy ile listenir acmak için asağıdaki kodu kullanabilirsiniz

Kod: Tümünü seç

 try
    serverI.Active:=false;
    serverI.Bindings.Clear;
    with serverI.Bindings.Add do
      begin
          IP   := sysip;
          Port := cihaz1port;
      end;
    with serverI.Bindings.Add do
      begin
          IP   := sysip;
          Port := Cihaz2port;
      end;
    with serverI.Bindings.Add do
      begin
          IP   := sysip;
          Port := cihaz3port;
      end;
    serverI.Active:=True;
    serverI.StartListening;
    except On E:Exception do begin
             memo1.lines.add(E.Message+'*****Listenir Start hatası '+e.ClassName);
           end;
    end;
ve bu listenirler calısınca ona baglanacak olan clientler ise

Kod: Tümünü seç

uses  idIOhandler  //eklenerek IOHandler kontrolü ile baglantıları manuel baglantı listesine alabilirsiniz

  private
     { Private declarations }
  public
   form1: TForm1;
    { Public declarations }
  end;
  var
    Form1  : TForm1;
    Cihaz1hand: TidIOhandler;
    Cihaz2hand: TidIOhandler;
    Cihaz3hand: TidIOhandler;
gibi tanımlanmıs olan değikenlere siz isterseniz bunu baska yere yada bir array içine gömebilirsiniz

Kod: Tümünü seç

procedure TForm1.ServerIConnect(AContext: TIdContext);
begin
    if Acontext.Binding.Port=cihaz1port then begin
             memo1.lines.add('Cihaz1 Baglandı TCP IP:'+acontext.Binding.PeerIP+' Port:'+inttostr(acontext.Binding.port)+'/'+inttostr(acontext.Binding.PeerPort));
             Cihaz1Hand:=Acontext.Connection.IOHandler;
    end;

    if Acontext.Binding.Port=Cihaz2port then begin
             memo2.lines.add('Cihaz2 Baglandı TCP IP:'+acontext.Binding.PeerIP+' Port:'+inttostr(acontext.Binding.port)+'/'+inttostr(acontext.Binding.PeerPort));
             Cihaz2hand:=Acontext.Connection.IOHandler;
    end;

    if Acontext.Binding.Port=Cihaz3port then begin
             memo3.lines.add('Cihaz3 Baglandı TCP IP:'+acontext.Binding.PeerIP+' Port:'+inttostr(acontext.Binding.port)+'/'+inttostr(acontext.Binding.PeerPort));
             Cihaz3hand:=Acontext.Connection.IOHandler;
    end;
end;
ile baglanma esnasında IOhandler sayesinde baglantıları daha sonra onlara cevap vermek üzere handle edebiliyoruz
Okuma işlemleri yine onexecute esnasında daha once soru sormak için yukarıda verdiğim geleni okuyacak kısım ile aynı olacak sekilde
CAN ALICI NOKTA malesef karsı program java ile yazıldı ise ve onlar da nedense hepsi tüm tcp/ip haberleşmelerini ByteArray olarak yaptıkları için
cevap verme su sekilde sorunsuz calıstı

Kod: Tümünü seç

procedure Tform1.Cihaz1SendTcp(gel: string);
var
ham : string;
gon : string;
buf : TIDBytes;
begin
   ham:='010000'+inttohex(length(gel),4);
   gon:=ham+gel;
   SetLength(Buf, Length(gon));
   CopyTIdString(gon,buf,0);

    if assigned(serverI.Contexts) then begin
	
       try
         Cihaz1hand.WriteDirect(buf,length(buf));
       except On E:Exception do
         memo1.lines.add('Error TCP: ' +  E.Message+ ' '+E.classname );
       end;
	   
    end
    else begin
      memo1.lines.add('Cihaz1 TCP Porta Gonderilmedi Porta Client Bağlı Değil ');
    end;
end;
WriteDirect komutu dişinda baska komut saglıklı olarak cevap vermedi diğer bazı komutlar da konrolunde sorun cıkardı
ihtiyacı olupta benim gibi arama yaparak okuyacak arkadaslara bir fikir vermesi amacıyla Herkese iyi çalısmalar Saglıklar dilerim.
Cevapla