Autor Téma: TCP Client  (Přečteno 305 krát)

Offline AlienStar

  • Mladík
  • **
  • Příspěvků: 99
  • Karma: 2
TCP Client
« kdy: 14-09-2018, 23:54:38 »
Dobrý den.

Prosím o radu jak zprovoznit komunikaci po TCP.
Dělám program ( client ) , kde potřebuji pravidelně načítat a posílat data přes TCP ( k tomu použiji do budoucna komponentu TTimer
Když stisknu tlačítko poprvé, vše se pošle a načte jak má ,, ale na podruhé mi to píše chybu Connection error: Already connected
Pokud při druhém stisku už neprovedu Connect; tak to hodí zase chybu :  Connection error: Connection Closed Gracefully

Proč mi to háže chybu?
Mockrát díky

Kód: Delphi [Vybrat]
  1.  
  2. procedure TForm1.Button5Click(Sender: TObject);
  3. var  s : string;
  4. begin
  5.     try
  6.       with IdTCPClient1 do
  7.         begin
  8.           Port  := StrToInt(Edit1.Text);
  9.           Host  := Edit2.Text;
  10.  
  11.          Connect;
  12.  
  13.           s := IOHandler.ReadString(10);
  14.           Memo1.Lines.Add(s);
  15.  
  16.           IOHandler.WriteLn(Edit3.Text);
  17.  
  18.           disconnect;
  19.         end;
  20.      except
  21.     on E : Exception do
  22.     begin
  23.       ShowMessage('Connection Error: ' + E.Message);
  24.       exit;
  25.      end;
  26.     end;
  27. end;
  28.  
  29.  

Poslat text na server ( v tomto případě PLC ) funguje.
Ale pokud použiji řádek   s :=  IOHandler.ReadLn();   aplikace nahlásí chybu : Connection Error: Connection Closed Gracefully.

Online vandrovnik

  • Guru
  • *****
  • Příspěvků: 501
  • Karma: 36
    • Verze Delphi: 10.2
Re:TCP Client
« Odpověď #1 kdy: 15-09-2018, 17:03:50 »
Používal jsem zhruba toto:

Kód: Delphi [Vybrat]
  1.  var IdTcp:tIdTcpClient;
  2.  begin
  3.  IdTcp:=tIdTcpClient.Create;
  4.  try
  5.   IdTcp.Host:=aServer;
  6.   IdTcp.Port:=StrToInt(aPort);
  7.   IdTcp.ReadTimeout:=5000;
  8.   IdTcp.Connect;
  9.   try
  10.    // komunikace...
  11.   finally
  12.    IdTcp.Disconnect;
  13.   end;
  14.  finally
  15.   FreeAndNil(IdTcp);
  16.  end;
  17.  

Tj. vytvářel jsem si klienta pro každou komunikaci znovu, přišlo mi to jistější, než spoléhat na to, že po Disconnect opravdu všechno vrátí do stavu, aby se dalo zase znovu připojit.
Nicméně ani v tom Tvém kódu na první pohled nevidím žádnou zradu (krom toho, že by nebylo od věci používat try..finally).

Offline AlienStar

  • Mladík
  • **
  • Příspěvků: 99
  • Karma: 2
Re:TCP Client
« Odpověď #2 kdy: 15-09-2018, 23:58:19 »
Díky,, tvoje verze funguje  :-)

Jak jsi měl udělané načítání a zápis  ??

díky

Online vandrovnik

  • Guru
  • *****
  • Příspěvků: 501
  • Karma: 36
    • Verze Delphi: 10.2
Re:TCP Client
« Odpověď #3 kdy: 16-09-2018, 21:57:06 »
Jak jsi měl udělané načítání a zápis  ??

Já myslím, že víceméně stejně jako Ty - WriteXxx a ReadXxx, nebylo to nic speciálního.

Offline AlienStar

  • Mladík
  • **
  • Příspěvků: 99
  • Karma: 2
Re:TCP Client
« Odpověď #4 kdy: 17-09-2018, 22:57:46 »
ještě bych se zeptal.
jaký je rozdíl mezi :

IdTCPClient.Socket.WriteLn
IdTCPClient..IOHandler.WriteLn

Jestli použiji Socket nebo IOHandler ?

díky

Online vandrovnik

  • Guru
  • *****
  • Příspěvků: 501
  • Karma: 36
    • Verze Delphi: 10.2
Re:TCP Client
« Odpověď #5 kdy: 17-09-2018, 22:59:31 »
Používal jsem .IOHandler, ale rozdíl nevím.

Delfin instaluje

  • Host
Re:TCP Client
« Odpověď #6 kdy: 17-09-2018, 23:42:52 »
Mam pocit (ale u toho bych zustal), ze je nutne vycistit I/O buffer. Z hlavy nereknu, zkuste prohledat SO.

 

S rychlou odpovědí můžete používat BB kódy a emotikony jako v běžném okně pro odpověď, ale daleko rychleji.

Jméno: E-mail:
Ověření:
Kolik je šest plus čtyři (slovem):