Autor Beitrag
HellAngel28
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 36



BeitragVerfasst: Di 15.07.03 20:20 
hiya,
ich hab n problem mit file übertragung über TSocket(server/client)..

www.delphi-forum.de/viewtopic.php?t=2632

ich hab das hier ausprobiert, aber er überträgt bei mir maximal 8 KB.. egal welche grösse das file hat.. er überträgt maximal 8KB.. kann mir jemand helfen?
HellAngel28 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 36



BeitragVerfasst: Fr 18.07.03 10:41 
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 :
ausblenden volle Höhe 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:
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:
ausblenden 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:
//ClientRoutine bleibt gleich 

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..4096of Byte; // die Größe des Puffers ist beliebig, müsste nur (s.u.) 
 SizeOfBuffer: integer; 
begin  

  pBuffer := @Buffer;  
  SizeOfBuffer := Socket.ReceiveBuf(pBuffer^, 4096); //hier angeglichen werden 
  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