Hallo,
Ik heb 2 componentjes geschreven, één client(TTransferclient) en een server(TTransferserver), deze zijn bedoelt om files te transferen over het netwerk, ze zijn gebaseerd op Tclientsocket en Tserversocket..
Dit heb ik getest en ze werken goed, zo lang het lokaal blijft...
zodra ik files over het netwerk ga zenden gaat het fout, dan stopt hij ineens op een onwillekeurig punt ( wel een veelvoud an 8kb, omdat hij de data in stukken van 8kb stuurd..)
ik kom er niet meer uit, zou iemand misschien weten waar het aan zou kunnen liggen:
source:
(sorry voor de vele code..)
ttransferclient
ttransferserver:
Ik heb 2 componentjes geschreven, één client(TTransferclient) en een server(TTransferserver), deze zijn bedoelt om files te transferen over het netwerk, ze zijn gebaseerd op Tclientsocket en Tserversocket..
Dit heb ik getest en ze werken goed, zo lang het lokaal blijft...
zodra ik files over het netwerk ga zenden gaat het fout, dan stopt hij ineens op een onwillekeurig punt ( wel een veelvoud an 8kb, omdat hij de data in stukken van 8kb stuurd..)
ik kom er niet meer uit, zou iemand misschien weten waar het aan zou kunnen liggen:
source:
(sorry voor de vele code..)
ttransferclient
Delphi:
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
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
| unit transferclient; interface uses Windows, Messages, SysUtils, Classes, ScktComp,dialogs,ExtCtrls; type Ttransferclient = class(tclientsocket) private function getfilename:string; procedure setfilename(value:string); function getsendpercentage:integer; procedure sendnext; procedure init; //var bestandstream: tfilestream; { Private declarations } protected FOnTransfercomplete: TNotifyEvent; procedure Event(Socket: TCustomWinSocket; SocketEvent: TSocketEvent);override; { Protected declarations } public procedure sendbegin; property sourcefile:string read getfilename write setfilename; property sendpercentage:integer read getsendpercentage; constructor Create(AOwner: TComponent); override; { Public declarations } published property OnTransfercomplete: TNotifyEvent read FOnTransfercomplete Write FOnTransfercomplete; { Published declarations } end; var bestandsnaam:string; bestandstream: tfilestream; buffercount:integer; timeouttimer:ttimer; procedure Register; implementation procedure Register; begin RegisterComponents('Samples', [Ttransferclient]); end; function Ttransferclient.getfilename:string; begin result:=bestandsnaam; end; procedure Ttransferclient.setfilename(value:string); begin bestandsnaam:=value; end; constructor Ttransferclient.Create(AOwner: TComponent); begin inherited create(AOwner); end; procedure Ttransferclient.sendbegin; const MaxChunkSize = 8192; var filesize:integer; begin if Socket.Connected = true then begin bestandstream:=tfilestream.Create(sourcefile,fmOpenRead); bestandstream.Position := 0; //zend eerst de size van het bestand filesize:=bestandstream.Size; socket.SendBuf(filesize,sizeof(filesize)); end; end; procedure Ttransferclient.sendnext; const MaxChunkSize = 8192; var ChunkSize: Integer; CopyBuffer: array[0..MaxChunkSize] of Byte; begin if Socket.Connected = true then begin if (bestandstream= nil) then bestandstream:=tfilestream.Create(sourcefile,fmOpenRead); ChunkSize := bestandstream.Size - bestandstream.Position; if ChunkSize > 0 then begin if ChunkSize > MaxChunkSize then ChunkSize:= MaxChunkSize; bestandstream.Read(CopyBuffer, ChunkSize); Socket.SendBuf(CopyBuffer, ChunkSize); //ChunkSize := bestandstream.Size - bestandstream.Position; buffercount:=buffercount+1; if bestandstream.Position = bestandstream.Size then init; end end end; procedure Ttransferclient.Event(Socket: TCustomWinSocket; SocketEvent: TSocketEvent); begin case SocketEvent of seRead: if (socket.ReceiveText= 'next') then begin sendnext; end; else begin inherited Event(Socket,SocketEvent); end; end; end; function ttransferclient.getsendpercentage:integer; var deler:integer; begin try if (bestandstream.Size > 0) then begin deler := bestandstream.size div 100; result := bestandstream.Position div deler; end; except result:=100; end; end; procedure ttransferclient.init; begin if Assigned(FOnTransfercomplete) then FOnTransfercomplete(Self); bestandstream.Free; bestandstream:=nil; self.Active:=false; end; end. |
ttransferserver:
Delphi:
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
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
| unit TransferServer; interface uses Windows, Messages, SysUtils, Classes, ScktComp,dialogs; type TTransferServer = class(tserverSocket) private function getdestfile:string; procedure setdestfile(Value: string); { Private declarations } protected FOnTransfercomplete: TNotifyEvent; { Protected declarations } public constructor Create(AOwner: TComponent); override; Procedure Clientread(Sender: TObject; Socket: TCustomWinSocket); { Public declarations } published property destfile: string read getdestfile write setdestfile; property OnTransfercomplete: TNotifyEvent read FOnTransfercomplete Write FOnTransfercomplete; { Published declarations } end; procedure Register; var bestandsnaam :string; bestandsnaamstr: tfilestream; sizebekend:boolean; grootte:integer; implementation procedure Register; begin RegisterComponents('Samples', [TTransferServer]); end; constructor ttransferserver.Create(AOwner: TComponent); begin inherited create(AOwner); socket.OnClientRead := clientread; sizebekend:=false; bestandsnaamstr :=nil; end; Procedure ttransferserver.Clientread(Sender: TObject; Socket: TCustomWinSocket); const MaxChunkSize = 8192; var BytesReceived: Longint; CopyBuffer: Array[0..MaxChunkSize] of Byte; ChunkSize: Integer; begin if sizebekend = false then begin ChunkSize:= Socket.ReceiveLength; if ChunkSize > MaxChunkSize then ChunkSize:= MaxChunkSize; socket.ReceiveBuf(grootte,ChunkSize); sizebekend:=true; end else Begin if not FileExists(bestandsnaam) then begin //als de file niet bestaat maak hem dan en close de handle fileclose(FileCreate(bestandsnaam)); end else begin //als hij al wel bestaat, delete hem dan en maak een nieuwe aan deletefile(bestandsnaam); fileclose(FileCreate(bestandsnaam)); end; if bestandsnaamstr = nil then begin {als de stream nog niet bestaat, creer hem dan} bestandsnaamstr := tfilestream.Create(bestandsnaam,fmOpenReadWrite); bestandsnaamstr.position:=0; end; {lees de received bytes en schrijf deze naar te stream, lees ze per MAXCHUNKSIZE} while (Socket.ReceiveLength > 0) do begin ChunkSize:= Socket.ReceiveLength; if ChunkSize > MaxChunkSize then ChunkSize:= MaxChunkSize; BytesReceived:= Socket.ReceiveBuf(CopyBuffer,ChunkSize); bestandsnaamstr.Write(CopyBuffer, BytesReceived); end; end; {zend de volgende 8 bytes, nog ff wat netter coden...............} if assigned(bestandsnaamstr) then begin if bestandsnaamstr.Position < grootte then begin socket.SendText('next'); end else begin if Assigned(FOnTransfercomplete) then FOnTransfercomplete(Self); bestandsnaamstr.Free; end; end else begin socket.SendText('next') end; end; function ttransferserver.getdestfile:string; begin result:=bestandsnaam; end; procedure ttransferserver.setdestfile(Value: string); begin bestandsnaam:=Value; end; end. |