| Zitat: |
Wie kann ich eine Datei über die Sockets verschicken?
Eigentlich ist es ganz einfach. Was man dazu braucht sind die Befehle SendStream und ReceiveBuf, mehr nicht :
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31:
| procedure TForm1.ClientSocket1Connect(Sender: TObject; Socket: TCustomWinSocket); var FStream: TFileStream;
begin
FStream := TFileStream.Create('C:\datei1.txt', fmOpenRead); Socket.SendStream(FStream);
end;
procedure TForm1.ServerSocket1ClientRead(Sender: TObject; Socket: TCustomWinSocket); var FStream: TFileStream; SizeOfFile: Integer; pBuffer: Pointer; begin FStream := TFileStream.Create('C:\datei2.txt', fmOpenWrite); SizeOfFile := Socket.ReceiveLength; GetMem(pBuffer, SizeOfFile); try Socket.ReceiveBuf(pBuffer^, SizeOfFile); FStream.Write(pBuffer^, SizeOfFile); finally FreeMem(pBuffer); FStream.Free; end;
end; |
Wenn man aber immer eine Statusmeldung über den Fortschritt vom Server haben will (um z.B. die Übertragunsrate zu berrechnen) kann man einen Buffer benutzen, der kleiner als die ankommende Datei ist. Die gesendeten Daten werden Stück für Stück in den Buffer geschrieben und jedesmal, wenn dieser voll ist, sendet der Server eine Statusmeldung. dies könnte z.B. so realisiert werden:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29:
| var FileStream: TFileStream;
procedure TForm1.ServerSocket1ClientConnect(Sender: TObject; Socket: TCustomWinSocket); begin FileStream := TFileStream.Create('c:\datei2.txt', fmCreate or fmOpenWrite);
end;
var AlreadyReceived: integer;
procedure TForm1.ServerSocket1ClientRead(Sender: TObject; Socket: TCustomWinSocket); var pBuffer: pointer; Buffer: array[0..4096] of Byte; SizeOfBuffer: integer; begin
pBuffer := @Buffer; SizeOfBuffer := Socket.ReceiveBuf(pBuffer^, 4096); FileStream.Write(pBuffer^, SizeOfBuffer); Inc(AlreadyReceived, SizeOfBuffer); Socket.SendText(IntToStr(AlreadyReceived)); end; |
Die Auswertung der Statusmeldung müsste allerdings noch geschrieben werden. Ebenso müssten FStream und FileStream noch freigegben werden.
Ich hoffe, ich habe Manchem mit dieser FAQ helfen können.
O'rallY
|
Das ist der code von orally .. aber.. bei mir überträgt er, wie gesagt, nur maximal 8 KB.. aber ich v ersteh nich warum.. help plz