const packetlen=1024; type tpacket=array[1..packetlen] of char; var Form1: TForm1; packets: array of tpacket;
在服务器端用以下程序分割文件: procedure tform1.readintobuffer(s:string); var i,j:integer; infile :file; begin assignfile(infile,s); reset(infile,1); i:=filesize(infile) div packetlen; setlength(packets,i+1); for i:=0 to length(packets)-2 do blockread(infile,packets[i],packetlen); i:=length(packets)-1; j:=filesize(infile) mod packetlen; blockread(infile,packets[i],j); edit1.Tag:=filesize(infile); closefile(infile); end;
在服务器端用以下程序处理当serversock1得到信息的事件: procedure TForm1.ServerSocket1ClientRead(Sender: TObject; Socket: TCustomWinSocket); var buffer:array[0..packetlen] of char; i,j,k:integer; temp:string; begin socket.ReceiveBuf(buffer,length(buffer)); i:=listbox1.Items.IndexOf(socket.RemoteAddress); case buffer[0] of 'R':begin temp:=extractfilename(edit1.Text); j:=length(temp); temp:=format('%.10d%.10d',[edit1.tag,j])+temp; strpcopy(buffer,'B'+temp); serversocket1.Socket.Connections[i].SendBuf(buffer,length(buffer)); end; 'N':begin j:=strtoint(copy(buffer,2,10)); if (j+1)=length(packets) then buffer[0]:='E' else buffer[0]:='C'; for k:=0 to (packetlen-1) do buffer[k]:=packets[j][k]; serversocket1.Socket.Connections[i].SendBuf(buffer,length(buffer)); end; 'Q':socket.Close; end; end;
在客户端用以下程序处理clientsock得到信息时的事件 procedure TForm1.ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket); var buffer:array[0..packetlen] of char; namesize,i,j:integer; begin clientsocket1.Socket.ReceiveBuf(buffer,length(buffer)); case buffer[0] of 'B':begin edit2.Tag:=strtoint(copy(buffer,2,10)); namesize:=strtoint(copy(buffer,12,10)); edit2.Text :=edit2.Text +copy(buffer,22,namesize); setlength(packets,0); sendpacket('N'+format('%.10d',[length(packets)])); statusbar1.SimpleText:='开始传送文件......'; end; 'C':begin i:=length(packets); setlength(packets,i+1); for j:=1 to packetlen do packets[i][j]:=buffer[j]; sendpacket('N'+format('%.10d',[length(packets)])); end; 'E':begin i:=length(packets); setlength(packets,i+1); for j:=0 to (packetlen-1) do packets[i][j]:=buffer[j]; sendpacket('Q'); combinepacket; showmessage('文件接收完毕'); end; end;
end;
在客户端用以下程序处理当文件传送完毕后合并成单个文件: procedure tform1.combinepacket; var outfile :file; i,j:integer; begin assignfile(outfile,edit2.Text); rewrite(outfile,1); for i:=0 to length(packets)-2 do blockwrite(outfile,packets[i],packetlen); i:=length(packets)-1; j:=edit2.tag mod packetlen; blockwrite(outfile,packets[i],j); closefile(outfile); end;
const packetlen=1024; type tpacket=array[1..packetlen] of char; var Form1: TForm1; packets: array of tpacket;
在服务器端用以下程序分割文件: procedure tform1.readintobuffer(s:string); var i,j:integer; infile :file; begin assignfile(infile,s); reset(infile,1); i:=filesize(infile) div packetlen; setlength(packets,i+1); for i:=0 to length(packets)-2 do blockread(infile,packets[i],packetlen); i:=length(packets)-1; j:=filesize(infile) mod packetlen; blockread(infile,packets[i],j); edit1.Tag:=filesize(infile); closefile(infile); end;
在服务器端用以下程序处理当serversock1得到信息的事件: procedure TForm1.ServerSocket1ClientRead(Sender: TObject; Socket: TCustomWinSocket); var buffer:array[0..packetlen] of char; i,j,k:integer; temp:string; begin socket.ReceiveBuf(buffer,length(buffer)); i:=listbox1.Items.IndexOf(socket.RemoteAddress); case buffer[0] of 'R':begin temp:=extractfilename(edit1.Text); j:=length(temp); temp:=format('%.10d%.10d',[edit1.tag,j])+temp; strpcopy(buffer,'B'+temp); serversocket1.Socket.Connections[i].SendBuf(buffer,length(buffer)); end; 'N':begin j:=strtoint(copy(buffer,2,10)); if (j+1)=length(packets) then buffer[0]:='E' else buffer[0]:='C'; for k:=0 to (packetlen-1) do buffer[k]:=packets[j][k]; serversocket1.Socket.Connections[i].SendBuf(buffer,length(buffer)); end; 'Q':socket.Close; end; end;
在客户端用以下程序处理clientsock得到信息时的事件 procedure TForm1.ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket); var buffer:array[0..packetlen] of char;//->把这里的0改为1,试试看.还有它只适合传小文件. namesize,i,j:integer; begin clientsocket1.Socket.ReceiveBuf(buffer,length(buffer)); case buffer[0] of 'B':begin edit2.Tag:=strtoint(copy(buffer,2,10)); namesize:=strtoint(copy(buffer,12,10)); edit2.Text :=edit2.Text +copy(buffer,22,namesize); setlength(packets,0); sendpacket('N'+format('%.10d',[length(packets)])); statusbar1.SimpleText:='开始传送文件......'; end; 'C':begin i:=length(packets); setlength(packets,i+1); for j:=1 to packetlen do packets[i][j]:=buffer[j]; sendpacket('N'+format('%.10d',[length(packets)])); end; 'E':begin i:=length(packets); setlength(packets,i+1); for j:=0 to (packetlen-1) do packets[i][j]:=buffer[j]; sendpacket('Q'); combinepacket; showmessage('文件接收完毕'); end; end;
end;
在客户端用以下程序处理当文件传送完毕后合并成单个文件: procedure tform1.combinepacket; var outfile :file; i,j:integer; begin assignfile(outfile,edit2.Text); rewrite(outfile,1); for i:=0 to length(packets)-2 do blockwrite(outfile,packets[i],packetlen); i:=length(packets)-1; j:=edit2.tag mod packetlen; blockwrite(outfile,packets[i],j); closefile(outfile); end;