Entwickler-Ecke

Internet / Netzwerk - Datei versenden Sockets


Fighter#1 - Di 05.12.06 14:55
Titel: Datei versenden Sockets
Hallo, hab da mal ne Frage
Ich versende, wie in der Library beschrieben eine Datei (ein Bild 46 Kbyte) über die Sockets, nur wann weiß ich ob das Bild da ist, bzw. wann ich es öffnen kann?
Wenn ich einfach unter den OnRead Code das Bild öffne bekomm ich ne Fehlermeldung, dass die Datei noch benutzt wird


Narses - Di 05.12.06 14:59

Moin!

user profile iconFighter#1 hat folgendes geschrieben:
Ich versende, wie in der Library beschrieben eine Datei (ein Bild 46 Kbyte) über die Sockets,

Gib mal einen exakten Link, WAS du mit "aus der Library" meinst, oder zeig mal deinen Code. ;)

user profile iconFighter#1 hat folgendes geschrieben:
nur wann weiß ich ob das Bild da ist, bzw. wann ich es öffnen kann?
Wenn ich einfach unter den OnRead Code das Bild öffne bekomm ich ne Fehlermeldung, dass die Datei noch benutzt wird

Das ist klar, es wird ja sicher nicht in einem Block empfangen.

cu
Narses


Fighter#1 - Di 05.12.06 15:06

Ok, wie immer gings ja rasend schnell :-D
Und nun mein COde

Klient (sender)
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
procedure TForm1.bildSocketConnect(Sender: TObject; Socket: TCustomWinSocket);
var
  scr:TBitmap;
  FStream: TFileStream;
begin
  scr:=TBitmap.Create;
  //Screenshot machen
  MakeScreenshot(scr);
  //Screenshot speichern
  scr.SaveToFile(ExtractFilePath(paramstr(0))+'\scr.bmp');
  //Als Jpeg
  BmpToJpg(ExtractFilePath(paramstr(0))+'\scr.bmp',1);
  //In den Stream einbinden
  FStream := TFileStream.Create(ExtractFilePath(paramstr(0))+'\scr.jpg', fmOpenRead);
  //und verschicken
  Socket.SendStream(FStream);
  //Dannn Socket deaktivieren, womit im Server bild geladen wird ...
  bildSocket.Active:=False;
  //Bitmal löschen
  DeleteFile(ExtractFilePath(paramstr(0))+'\scr.bmp');
end;



Server (empfänger)
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:
//Die Empfangen Prozedur 
procedure TForm1.BildSocketClientRead(Sender: TObject;
  Socket: TCustomWinSocket);
var
  FStream: TFileStream;
  SizeOfFile: Integer;
  pBuffer: Pointer;
begin
  //Stream erstellen;
  FStream := TFileStream.Create(ExtractFilePath(paramstr(0))+'\scr.jpg', fmOpenWrite);
  //Zum füller Dateigröße empfangen
  SizeOfFile := Socket.ReceiveLength;
  //in den Buffer packen
  GetMem(pBuffer, SizeOfFile);
  //empfangen
  try
    Socket.ReceiveBuf(pBuffer^, SizeOfFile);
    FStream.Write(pBuffer^, SizeOfFile);
  finally
    FreeMem(pBuffer);
    FStream.Free;
  end;
end;

//Und zum Bild anzeigen
procedure TForm1.BildSocketClientDisconnect(Sender: TObject;
  Socket: TCustomWinSocket);
begin
  Image1.Picture.LoadFromFile(ExtractFilePath(paramstr(0))+'\scr.jpg');
end;


Narses - Di 05.12.06 15:10

Moin!

Wo hast du denn den Code her? :gruebel: Das kann nicht klappen, schon aus mehreren Gründen... :?

Schonmal das hier [http://www.delphi-library.de/topic_TerminatorzeichenProtokollTutorial++2+Sockets+v100_65487.html] angesehen? ;)

cu
Narses


Fighter#1 - Di 05.12.06 15:13

Ich schaus mir an,
den Code hab ich aus der Library : http://www.delphi-library.de/topic_eine+Datei+ueber+die+Sockets+verschicken_2632.html


Narses - Di 05.12.06 15:24

Moin!

Ja, dieser FAQ-Beitrag ist schon etwas älter und hat z.B. das Problem, nur bis 8kb großen Dateien zu funktionieren... (und ist abgesehen davon eh nicht wirklich sauber gelöst).

Ich habe mal bei den Mods vorgeschlagen, den Beitrag wieder zum Editieren freizugeben, dann kann man das da mal vermerken.

cu
Narses


Fighter#1 - Di 05.12.06 19:31

... drum hats nie geklappt, und es sind nur exakt 8kb angekommen, danke