(Moderator)
Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
Delphi 2006 Professional
|
Re: 2 Codes in clientsocketread vereinen ?
8. Mai 2004, 12:34
Du musst den zweiten sourceabschnitt einfach umbenennen und dann sollte es so ungefähr aussehen
Delphi-Quellcode:
public
daten:boolean;
pos,size:integer;
mem:TMemoryStream;
var
Form1: TForm1;
FStream: TFileStream;
procedure TForm1.ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket);
var
iLen: Integer;
Bfr: Pointer;
begin
iLen := Socket.ReceiveLength;
GetMem(Bfr, iLen);
try
Socket.ReceiveBuf(Bfr^, iLen);
FStream.Write(Bfr^, iLen);
finally
FreeMem(Bfr);
end;
ClientSocket2Read(Sender, Socket);
end;
procedure TForm1.ClientSocket2Read(Sender: TObject; Socket: TCustomWinSocket);
var a:array[0..4096]of byte;
buf:pointer;
i:integer;
s:string;
begin
if not daten then
begin
s := Socket.ReceiveText; //Text empfangen
if Copy(s,1,4) = 'Tree' then //wurde der "Tree" gesendet?
//in der alten Version stand hier 'tree' - kein wunder, dass nie was angekommen is ^^
begin
delete(s,1,5); // den Text löschen
for i := 1 to length(s) do //#13#10 suchen
if (length(s) > i) and
((s[i] = #13) and (s[i+1] = #10)) then break;
if i = length(s) then exit; //nicht gefunden --> abbrechen
// es könnte theoretisch sein, dass auch der string in mehreren packeten ankommt, es ist aber sehr unwahrscheinlich, deshalb hab ich darauf verzichtet. bei bedarf einfach genau so wie mit dem stream verfahren...
size := StrToint(copy(s,1,i-1)); //größe abspeichern
daten := true; //daten kommen jetzt!
mem.Clear; //stream löschen
delete(s,1,i+1); //alles bis zum #13#10 aus dem string löschen
mem.Position := 0;
for i := 1 to length(s) Do //alles übriggebliebene in den stream speichern
mem.Write(s[i],1);
//sollte eigentlich auch mit der alten Methode gehen, kannst ja ausprobieren, wenns dir nicht gefällt ;-P
pos := length(s); //position festsetzen
if pos >= size then //schon alle bytes empfangen? (triff ein, wenn alles in einem packet gesendet wurde)
begin
daten := false; //keine daten mehr!
mem.position := 0; //stream zurücksetzen
pos := 0; //anzahl der empfangenen bytes zurücksetzen
TreeView1.Items.Clear;
TreeView1.LoadFromStream(mem); //empfangenen tree ins treeview laden
end;
end;
end
else
begin
buf := @a;
i := Socket.ReceiveBuf(buf^,4096); //daten empfangen
mem.write(buf^,i); //in stream speichern
pos := pos + i; //anzahl der empfangenen bytes erhöhen
if pos >= size then //schon alle bytes empfangen?
begin
daten := false; //keine daten mehr!
mem.position := 0; //stream zurücksetzen
pos := 0; //anzahl der empfangenen bytes zurücksetzen
TreeView1.Items.Clear;
TreeView1.LoadFromStream(mem); //empfangenen tree ins treeview laden
end;
end;
end;
natürlich die zweite procedure noch bissl abändern damit du da nicht schon wieder von Clientsocket liest - am besten du liest schon im ersten abschnit aus und packst es in ne variable
Jens Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
|
|
Zitat
|