Hi Leute!
Ich beschäftige mich zur Zeit mit der Dateiübertragung zwischen Sockets!
Ziel ist es, eine Datei zwischen Client(TClientSocket) und Server(TServerSocket) zu übertragen ohne NichtStandard-Komponenten zu verwenden!
Ja denk ich mir: Kein Thema, oder doch?
Mein Denkansatz war der! Ich mache eine Schablone als Array of Bytes und lege diese Blockweise über meine Datei. Danach verschicke ich den so entstandenen ByteBuffer via Socket.SendBuf();
Auf der Serverseite hole ich via Socket.ReceiveBuf() das ganze wieder in ein Array of Bytes und schreibe is wieder Blockweise in eine Datei!
So der bisherige Code:
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: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59:
|
type TFileBlocks = Array [0..1024 - 1] of Byte; var Form1: TForm1; FileBuffer: TFileBlocks; SendFile: file;
implementation
procedure SendFileBlock(StartBlock: Integer); var iReadCount: Integer; begin ZeroMemory(@FileBuffer, 0);
if(not eof(SendFile)) then begin BlockRead(SendFile, FileBuffer, sizeof(FileBuffer), iReadCount); Form1.ClientSocket1.Socket.SendBuf(FileBuffer, iReadCount); end else begin CloseFile(SendFile); CloseFile(tFile); Form1.ClientSocket1.Socket.SendText('endoffile'); end; end;
procedure TForm1.SendFileBttnClick(Sender: TObject); begin ClientSocket1.Socket.SendText('sending:Test.file'); end;
procedure TForm1.ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket); var RecText: String; begin RecText := Socket.ReceiveText; if(RecText = 'ready') then begin AssignFile(SendFile, Path.Text); Reset(SendFile, 1);
SendFileBlock(); end else if(RecText = 'next') then begin SendFileBlock(); end; end; |
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: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55:
|
type TFileBlocks = Array [0..1024] of Byte; pBuffer = ^TFileBlocks;
var Form1: TForm1; FILE_NAME: String; TargetFile: file;
implementation
procedure TForm1.ServerSocket1ClientRead(Sender: TObject; Socket: TCustomWinSocket); var RecText: String; BlockCount, WriteCount: Integer; RecLength: Integer; bBuffer: Array of Byte; pFileBuffer: pBuffer; begin RecLength := Socket.ReceiveLength; RecText := Socket.ReceiveText; if(MidStr(RecText, 1, StrLen(PChar('sending:'))) = 'sending:') then begin FILE_NAME := MidStr(RecText, StrLen(PChar('sending:')) + 1, StrLen(PChar(RecText)) - StrLen(PChar('sending:')));
AssignFile(TargetFile, 'C:\' + FILE_NAME); Rewrite(TargetFile, 1);
ServerSocket1.Socket.Connections[0].SendText('ready'); end else if(RecText = 'endoffile') then begin CloseFile(TargetFile); ShowMessage('ENDE'); end else begin ZeroMemory(pFileBuffer, 0);
GetMem(pFileBuffer, RecLength);
Socket.ReceiveBuf(pFileBuffer , BlockCount); BlockWrite(TargetFile, pFileBuffer^, RecLength, WriteCount); ServerSocket1.Socket.Connections[0].SendText('next'); end; end; |
Es ist ja nicht so dass jetzt in der Datei nix drin steht!
Der Inhalt der orginalfile ist:
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| #EXTM3U #EXTINF:326,Black Eyed Peas - My Humps Personal Dats\Mucke2\005 - Black Eyed Peas - My Humps.mp3 #EXTINF:225,Rammstein - Benzin Personal Dats\Mucke2\006 - Rammstein - Benzin.mp3 #EXTINF:213,Sean Paul - We Be Burnin' Personal Dats\Mucke2\008 - Sean Paul - We Be Burnin'.mp3 #EXTINF:237,20 Pink - Just like a Pill Personal Dats\Mucke2\01 - 20 Pink-Just like a Pill.mp3 #EXTINF:207,Jack Johnson - Better Together Personal Dats\Mucke2\01 - Better Together.mp3 .... |
Ja das ist eine Winamp Playlist
Das ist das, was dabei raus kommt:
1. Variante:
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| òÍ (
54,Michael Jackson - Wanna Be Startin Somethin 2008 Personal Dats\Mucke2\Top100_4_08\067-michael_jackson_-_wanna_be_startin_somethin_2008-ministry.mp3 #EXTINF:215,Colbie Caillat - The Little Things Personal Dats\Mucke2\Top100_4_08\068-colbie_caillat_-_the_little_things-ministry.mp3 #EXTINF:203,Kanye West ft Chris Martin - Homecoming Personal Dats\Mucke2\Top100_4_08\069-kanye_west_ft_chris_martin_-_homecoming-ministry.mp3 #EXTINF:233,Amy Winehouse - Valerie ... |
2. Variante ist dann Binäres gedöns!
Es sieht immer anders aus!
Huhuhuuuuuu..... Ich hock dran und könnt kotzen!
Danke im Voraus und Gruß,
Seraph
Ps.: @Narses: Dein Tutorial hab ich schon gesehen (Respekt übrigens) aber das ist mächtiger als das was ich benötige!
Es muss doch auf diesem Weg gehen!