Delphi Can

Orjinalini görmek için tıklayınız: TCP reponse
Şu anda (Arşiv) modunu görüntülemektesiniz. Orjinal Sürümü Görüntüle internal link
Selam arkadaslar. bir turlu coze bilmirem. TCP ile command veriyorum, Cevabi yarimciq gelir. anlamiram neden!
Kodu verirem.

Kod:
unit Unit1;

interface

uses
 Winapi.Windows, Winapi.Messages, System.SysUtils, System.Classes, Vcl.Forms,
 Vcl.StdCtrls, Vcl.ComCtrls, IdTCPClient, IdGlobal, IdBaseComponent,
 IdComponent, IdTCPConnection, Vcl.Controls, Vcl.Imaging.jpeg, Vcl.ExtCtrls,
 IdCustomTCPServer, IdTCPServer;

type
 TForm1 = class(TForm)
   Button1: TButton;
   Edit1: TEdit;
   Edit2: TEdit;
   RichEdit1: TRichEdit;
   IdTCPClient1: TIdTCPClient;
   procedure Button1Click(Sender: TObject);
 private
   function BytesToHex(const Bytes: TIdBytes): string;
   function HexBytesToDecimal(HexStr: string): Integer;
 public
 end;

var
 Form1: TForm1;

implementation

{$R *.dfm}

function TForm1.HexBytesToDecimal(HexStr: string): Integer;
var
 CleanHex: string;
begin
 CleanHex := StringReplace(HexStr, ' ', '', [rfReplaceAll]);
 Result := StrToInt('$' + CleanHex);
end;

function TForm1.BytesToHex(const Bytes: TIdBytes): string;
var
 i: Integer;
begin
 Result := '';
 for i := 0 to Length(Bytes) - 1 do
   Result := Result + IntToHex(Bytes[i], 2) + ' ';
end;

procedure TForm1.Button1Click(Sender: TObject);
var
 TCPClient: TIdTCPClient;
 HelloZGW, ResponseBytes: TIdBytes;
 serverIP: string;
 Response: string;
 HexStr: string;
 hexString: string;
 byteCount, i: Integer;
begin

 serverIP := Trim(Edit1.Text);
 if serverIP = '' then
 begin
   RichEdit1.Lines.Add('Please enter a valid server IP in Edit2.');
   Exit;
 end;


 hexString := Trim(Edit2.Text);
 hexString := StringReplace(hexString, ' ', '', [rfReplaceAll]);


 if (Length(hexString) mod 2) <> 0 then
 begin
   RichEdit1.Lines.Add('Invalid hex string. The number of hex digits must be even.');
   Exit;
 end;


 byteCount := Length(hexString) div 2;
 SetLength(HelloZGW, byteCount);
 for i := 0 to byteCount - 1 do
   HelloZGW[i] := StrToInt('$' + Copy(hexString, 2 * i + 1, 2));


 TCPClient := TIdTCPClient.Create(nil);
 try
   TCPClient.Host := serverIP;
   TCPClient.Port := 6801;
   TCPClient.ConnectTimeout := 2000;
   TCPClient.ReadTimeout := 2000;

   try
     TCPClient.Connect;

     TCPClient.IOHandler.Write(HelloZGW);


     Response := TCPClient.IOHandler.ReadLn();

     TCPClient.IOHandler.ReadBytes(ResponseBytes, -1, False);

     RichEdit1.Clear;
     RichEdit1.Lines.Add(BytesToHex(ResponseBytes));


     HexStr := StringReplace(BytesToHex(ResponseBytes), ' ', '', [rfReplaceAll]);
     if Length(HexStr) >= 8 then
     begin
       HexStr := Copy(HexStr, Length(HexStr) - 7, 8);

     end
     else
       RichEdit1.Lines.Add('Response too short for conversion.');
   finally
     if TCPClient.Connected then
       TCPClient.Disconnect;
   end;
 except
   on E: Exception do
     RichEdit1.Lines.Add('Error connecting to ' + serverIP + ': ' + E.Message);
 end;
 TCPClient.Free;
end;

end.


Bazi serverlerde calisir full responsedi TCP veriyor, abzilarinda yok. fakat ben bakiyorum basga programalda, yarimciq response cevabini gosterende Project1, basga softwarelerle bakdikda full response gorunuyor. Burada hata nerede?

Bua rada misal olaraq:

Response := TCPClient.IOHandler.ReadLn(); deyisdirib Response := TCPClient.IOHandler.ReadLn(#1234); veya Response := TCPClient.IOHandler.ReadLn(#3000)  ve sair yazinca full gosterir amma yenede dogru calismaz, yardimci olsaniz sevinerem;
Dinleyen bölüm tekrarlı çalışması gerekiyor. Buffer'da data olup olmadığın kontrolünü yaparak yola devam etmek daha sağlıklı.

Ayrıca bu işlemler senkron değil asenkron işletilecek şekilde  bir thread altına konarak, event formunda takip edilirse sağlıklı olur.

Datanın bittiğini veri içerisinde yer almayan bir kontrol karakteri ile takip etmek gelen datayı anlamlı parçalara bölmek için faydalı olur. (ben mesela tilda karakteri kullanırım satır sonlu olmak zorunda değil çünkü) 

karakter şu şekilde tırnağın içindekidir "~"
(18-03-2025, Saat: 09:10)mrmarman Adlı Kullanıcıdan Alıntı: [ -> ]Dinleyen bölüm tekrarlı çalışması gerekiyor. Buffer'da data olup olmadığın kontrolünü yaparak yola devam etmek daha sağlıklı.

Ayrıca bu işlemler senkron değil asenkron işletilecek şekilde  bir thread altına konarak, event formunda takip edilirse sağlıklı olur.

Datanın bittiğini veri içerisinde yer almayan bir kontrol karakteri ile takip etmek gelen datayı anlamlı parçalara bölmek için faydalı olur. (ben mesela tilda karakteri kullanırım satır sonlu olmak zorunda değil çünkü) 

karakter şu şekilde tırnağın içindekidir "~"

Tessekur ederim, terminatoru "~" yazaraq qeyd edim?