Ir al contenido



Foto

Problema conexión tcp /ip con un servidor de terminales

delphi

  • Por favor identifícate para responder
No hay respuestas en este tema

#1 jmonfor

jmonfor

    Member

  • Miembros
  • PipPip
  • 20 mensajes

Escrito 27 mayo 2019 - 03:17

Un saludo a todos/as, 

 

Estoy desarrollando un software que está permanentemente leyendo los datos que le llegan desde un ST (servidor de terminales) y luego mediante DataSnap lo distribuye a otros clientes. La conexión es muy simple, ya que no deja de ser una conexión TCP / IP , y para la lectura de datos uso una TReadingThread. El programa realiza su función perfectamente, ya que se conecta, lee, y replica los datos que le llegan del ST. Mi problema viene cuando esa conexión se pierde por algún motivo, ya que entonces el Cliente TCP es incapaz de reconectar con el Servidor de Terminales.

 

A continuación os dejo el código. No entiendo por qué no consigue volver a conectar, sin embargo, cuando haces click en cerrar el formulario , si vuelve a conectar con el ST... y sinceramente no doy con la tecla.

 

Muchas gracias por vuestro tiempo.

 

Un saludo.


delphi
  1. unit Unit2;
  2.  
  3. interface
  4.  
  5. uses
  6. System.Classes,IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient, IdGlobal,
  7. IdContext,System.SyncObjs,SysUtils;
  8.  
  9. type
  10.  
  11. TDataEvent = procedure(const Data: string) of object;
  12.  
  13.  
  14. TReadingThread = class(TThread)
  15. private
  16. { Private declarations }
  17. FClient: TIdTCPClient;
  18. FData: string;
  19. FOnData: TDataEvent;
  20. FTermEvent : TEvent;
  21. procedure DataReceived;
  22. protected
  23. procedure Execute; override;
  24. public
  25. constructor Create(AClient: TIdTCPClient); reintroduce;
  26. property OnData: TDataEvent read FOnData write FOnData;
  27.  
  28. end;
  29. function ByteToBin(aByte : Byte) : string;
  30.  
  31. var
  32. Datos: string;
  33.  
  34. cont : integer;
  35.  
  36. implementation
  37.  
  38.  
  39.  
  40. uses Unit1, ServerContainerUnit1, ServerMethodsUnit1;
  41.  
  42. function ByteToBin(aByte : Byte): string;
  43. Const c10: Array[Boolean] of Char = ('0', '1');
  44. Var eLoop1: Byte;
  45. begin
  46. SetLength(Result, 8);
  47. For eLoop1 := 7 downto 0 do Result[8-eLoop1] := c10[(aByte and (1 shl eloop1)) <> 0];
  48. end;
  49.  
  50.  
  51.  
  52. { TReadingThread }
  53. constructor TReadingThread.Create(AClient: TIdTCPClient);
  54. begin
  55. inherited Create(True);
  56. FClient := AClient;
  57. FtermEvent := TEvent.Create(nil, true, false, '');
  58. end;
  59.  
  60.  
  61. procedure TReadingThread.Execute();
  62. var
  63. Buffer : TIdBytes;
  64. s: string;
  65. bin : string;
  66. begin
  67. { Place thread code here }
  68. while not Terminated do
  69. begin
  70. //vamos a estar testeando la conectividad con el ST. En caso de perder conectividad, reconectamos
  71. try
  72. if not ClientForm.IdTCPClient1.Connected then
  73. begin
  74.  
  75. ClientForm.IdTCPClient1.Connect;
  76. end;
  77. ClientForm.Memo1.Lines.Add('Conectado ' + DateTimeToStr(Now));
  78.  
  79. except
  80.  
  81. //ClientForm.IdTCPClient1.Disconnect;
  82.  
  83. //esperamos 5 segundos para intertar reconectar
  84. ClientForm.Memo1.Lines.Add('Intentando conectar... ' + DateTimeToStr(Now));
  85.  
  86. FtermEvent.WaitFor(10000);
  87.  
  88. continue;
  89. end;
  90. //conectado...
  91.  
  92. try
  93. while not Terminated do
  94. begin
  95. ClientForm.IdTCPClient1.IOHandler.ReadBytes(Buffer,1,False);
  96. Assert(Length(Buffer)=1);
  97. bin := ByteToBin(Buffer[0]);
  98. //Fdata := BytesToString(Buffer,0,1);
  99. FData := bin;
  100. if (FData <> '') and Assigned(FOnData) then
  101. Synchronize(DataReceived);
  102. end;
  103. except
  104. //ha ocurrido algo inesperado, entonces reconectará
  105.  
  106. end;
  107. end;
  108.  
  109. end;
  110.  
  111. procedure TReadingThread.DataReceived;
  112. begin
  113. if Assigned(FOnData) then
  114. FOnData(FData);
  115. end;
  116.  
  117. end.


delphi
  1. procedure TClientForm.FormShow(Sender: TObject);
  2. var
  3. Ini: TiniFile;
  4. Host : string;
  5. Puerto : Integer;
  6.  
  7. begin
  8. Ini := TIniFile.Create(ChangeFileExt(Application.ExeName, '.INI'));
  9.  
  10. ServerContainer1.DSServer1.Start; //iniciamos el servidor DataSnap
  11.  
  12.  
  13. //conectamos al ST leyendo los datos del fichero .INI
  14. // IdTCPClient1.Host := 'IP'; //Ip del ST
  15. // IdTCPClient1.Port := 10001;
  16. IdTCPClient1.Host := ini.ReadString('CONFIGURACION', 'IP',Host );
  17. IdTCPClient1.Port := ini.ReadInteger('CONFIGURACION','PUERTO',Puerto);
  18.  
  19. //IdTCPClient1.Connect;
  20.  
  21. try
  22. Thread := TReadingThread.Create(IdTCPClient1);
  23.  
  24. Thread.OnData := ClientForm.DatosRecibidos;
  25. Thread.Resume;
  26.  
  27. except
  28. IdTCPClient1.Disconnect;
  29. raise;
  30. end;
  31.  
  32.  
  33. end;


delphi
  1. procedure TClientForm.FormClose(Sender: TObject; var Action: TCloseAction);
  2. begin
  3.  
  4. IdTCPClient1.Disconnect; //desconectamos del ST
  5.  
  6. ServerContainer1.DSServer1.Stop; //detenemos el servidor
  7.  
  8. if Assigned(Thread) then Thread.Terminate;
  9. try
  10. IdTCPClient1.Disconnect;
  11. finally
  12. if Assigned(Thread) then
  13. begin
  14. Thread.WaitFor;
  15. FreeAndNil(Thread);
  16. end;
  17. end;
  18.  
  19. application.Terminate;
  20.  
  21. end;


  • 0





Etiquetado también con una o más de estas palabras: delphi