Oppure

Loading
30/08/10 9:44
niobi
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.


aaa
30/08/10 13:07
XBarboX
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
aaa
30/08/10 17:13
niobi
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 30/08/10 17:17
aaa