Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
Delphi - Delphi7 - server/client TIdTCP...
Forum - Delphi - Delphi7 - server/client TIdTCP...

Avatar
niobi (Normal User)
Newbie


Messaggi: 13
Iscritto: 23/08/2010

Segnala al moderatore
Postato alle 11:44
Lunedì, 30/08/2010
Salve a tutti.
A dire il vero, utilizzavo i vecchi componenti TServerSochet e TClientSocket, dalla versione Delphi5, componenti che si comportavano egregiame4nte ed attorno a cui ho costruito numerose procedure professionali.
Dovendo upgradarmi a Delphi7, i vecchi componenti sono scomparsi, ed ho dovuto studiarmi la molteplice (termine riduttivo) famiglia degli InDy, tra i quali ho scelto TIdTCPServer e l'omologo Client.
Problema: riporto un estratto delle procedure, che qui interessano (ritengo sufficienti):

Collegamento su 127.0.0.1, stesso computer, due procedure separate.

procedura client
-----------------
(comp. TIdTCPClient + TIdAntiFreeze)

creo un file su disco, contenente i dati da spedire (da poche decine ad alcune migliaia di caratteri), e lo spedisco al server:
  TmpStream := TMemoryStream.Create;
  TmpStream.LoadFromFile(IndirProc+'\REPORT\TMS.DAT'); // file creato su disco locale
  Client.OpenWriteBuffer;
  try
    Client.WriteStream(TmpStream);
  except
    on E: ESocketError do
       MesServ('Transazione non eseguita: '+#10+'"'+E.Message+'"'+#10+'Riprovare...');
  end;
  Client.CloseWriteBuffer;
  FreeAndNil(TmpStream);

procedura Server
--------------------
(comp. TIdTCPServer + TIdThreadMgrDefault + TIdAntiFreeze.)

(in Server.OnExecute)
  try
    TmpStream := TFileStream.Create(IndirArch+'\Trans7',fmCreate);
    Size := AThread.Connection.ReadInteger;  
    AThread.Connection.ReadStream(TmpStream,Size,False);
  except
    on E: Exception do begin
       MesServ(3,'Errore in lettura dati: '+E.Message); Ok := False;
    end;
  end;
  FreeAndNil(TmpStream);

Problema
---------
se leggo il valore di Size, è = 4.114.567.644 !!!!! (tramite debug) e la procedura chiude in errore, credo, per timeout.
Domanda:
cosa non ho fatto?
cosa legge sullo stream che io avrei dovuto azzerare, forse?
ma lo stream, non è quello che riceve dal client, visto che viene attivato l'evento OnExecute?
Grazie per una risposta.



PM
Avatar
XBarboX (Member)
Guru


Messaggi: 945
Iscritto: 31/12/2008

Up
1
Down
V
Segnala al moderatore
Postato alle 15:07
Lunedì, 30/08/2010
Anche se è consigliato usare le componenti indy puoi benissimo usare le "vecchie" componenti ServerSocket e ClientSocket.
Basta fare così per aggiungerle:
1)Apri delphi 7 (Ovvio :D)
2)Component->Install Packages...
3)Add..
4)Scegli il file C:\Programmi\Borland\Delphi 7\Bin\dclsockets70.bpl
5)Apri
6)Ok

Ora nella tab Internet avrai queste due componenti.

Spero di essere stato utile.

P.s.
se invece vuoi usare le componenti indy a tutti i costi guarda i due ottimi esempi presenti su questo sito nella sezione Sorgenti->Delphi, sezione networking.

Ciao

PM
Avatar
niobi (Normal User)
Newbie


Messaggi: 13
Iscritto: 23/08/2010

Up
-1
Down
V
Segnala al moderatore
Postato alle 19:13
Lunedì, 30/08/2010
grazie, ok, avevo già visto...
La mia necessità, visto il passaggio da 5 a 7, risiedeva nel fatto che, a volte, i componenti socket si incantavano, ed ho letto che Borland li ha dichiarati obsoleti (deceduti???); tutti poi, in altri forum, hanno osannato agli InDy, e ti
dirò, ho fatto un gran lavoro per capirci qualcosa, ne avrei fatto a meno.
------
Visto che ci siamo, vorrei esporti un problemino sui vecchi componenti. Adotto due programmi: il client, quando serve apre una connessione, spedisce una stringa, aspetta un messaggio e chiude la connessione; il server resta sempre in ascolto su un computer della rete.
Di tanto in tanto, però, il server, pur essendo "connesso" al socket, non risponde al client, che resta (diciamo) "sospeso" per avere aperto la connessione (accettata) ma senza successo (credo per la spedizione o per il messaggio di ritorno, non sono riuscito a capire). Sono costretto a chiudere la connessione manualmente e la procedura Server e riavviarla, dopodicché tutto funziona per altri 15 giorni oppure al giorno dopo. Sui miei computer sarà capitato 1 volta in 3 mesi, su computer di clienti, piuttosto spesso. il SO è XP per tutti. Questo problema mi ha spinto, riluttante, a migrare a InDy.
Secondo te, cosa potrebbe essere?
i computer, in rete, dialogano tutti sulla stessa porta oltre 50000, hanno un IP univoco e statico, tutto funziona perfettamente.
Mi piacerebbe parlarne, ma non saprei da dove iniziare.
-----
Comunque, per la questione InDy, tu sapresti dirmi il problema del size in lettura dello stream da dove esce?
Grazie.
Antonio

Ultima modifica effettuata da niobi il 30/08/2010 alle 19:17
PM