=============
定义数据包:
unit unit3;interface
type
p_head=(filelist,server_filelist,filelist_over);
cmd_page=packed record
cmd:p_head;
end;
file_page=packed record
head:p_head;
size:integer;
body:array[0..2000] of byte;
end;
implementationend.
=============
控制端:
unit Unit1;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Menus, StdCtrls, IdBaseComponent, IdComponent, IdUDPBase, IdSocketHandle,
IdUDPServer;type
TForm1 = class(TForm)
IdUDPServer1: TIdUDPServer;
Memo1: TMemo;
MainMenu1: TMainMenu;
N1: TMenuItem;
N2: TMenuItem;
Label1: TLabel;
Edit1: TEdit;
Button1: TButton;
procedure N1Click(Sender: TObject);
procedure N2Click(Sender: TObject);
procedure IdUDPServer1UDPRead(Sender: TObject; AData: TStream;
ABinding: TIdSocketHandle);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
ip:string;
end;var
Form1: TForm1;
liststream:Tmemorystream;
implementationuses Unit2,unit3;
{$R *.dfm}procedure TForm1.N1Click(Sender: TObject);
begin
form2.Show;
end;procedure TForm1.N2Click(Sender: TObject);
var cmd:cmd_page;
begin
cmd.cmd:=filelist;
idudpserver1.SendBuffer(ip,8002,cmd,sizeof(cmd));
end;procedure TForm1.IdUDPServer1UDPRead(Sender: TObject; AData: TStream;
ABinding: TIdSocketHandle);
var buff:array[0..2050] of byte;
head:p_head;
list:tstringlist;
i:integer;
filelist:^file_page;
stream:tstream;
str:string;
begin
adata.Read(buff,sizeof(adata.Size));
label1.Caption:=inttostr(adata.Size);
filelist:=@buff[0];
case filelist.head of
server_filelist: //文件列表
begin
liststream.Seek(0,2);
liststream.WriteBuffer(filelist.body,filelist.size);
end;
filelist_over://
begin liststream.Position:=0;
list:=tstringlist.Create;
list.LoadFromStream(liststream);
liststream.SaveToFile('1.txt'); {for i:=0 to list.Count-1 do
begin
memo1.Lines.Add(list.Strings[i]);
end; }
list.Free;
liststream.Clear;
end;
end;
end;procedure TForm1.FormCreate(Sender: TObject);
begin
liststream:=tmemorystream.Create;
end;end.
=========================
服务端:
unit Unit1;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, IdBaseComponent, IdComponent, IdUDPBase, IdUDPServer, StdCtrls,IdSocketHandle;type
TForm1 = class(TForm)
IdUDPServer1: TIdUDPServer;
Label1: TLabel;
procedure IdUDPServer1UDPRead(Sender: TObject; AData: TStream;
ABinding: TIdSocketHandle);
private
{ Private declarations }
public
{ Public declarations }
end;var
Form1: TForm1;
ip:string;
i:integer;
implementation
uses unit3;
{$R *.dfm}procedure findfile(path:string;list:tstringlist);
var h:thandle;
att:TWIN32FindData;
filename:string;
begin
if path[length(path)]<>'\' then path:=path+'\';
path:=path+'*.*';
h:=windows.FindFirstFile(pchar(path),att);
while h<>INVALID_HANDLE_VALUE do
begin
filename:=att.cFileName;
if (filename<>'.') and (filename<>'..') and (att.dwFileAttributes=FILE_ATTRIBUTE_DIRECTORY) then
begin
findfile(sysutils.ExtractFilePath(path)+filename,list); //目录
end
else if (filename<>'.') and (filename<>'..') and (att.dwFileAttributes<>FILE_ATTRIBUTE_DIRECTORY) then
begin
//文件
list.Add(sysutils.ExtractFilePath(path)+filename) ;
end;
if not windows.FindNextFile(h,att) then h:= INVALID_HANDLE_VALUE;//该目录下文件及目录已经遍历完毕;
end;
end;procedure TForm1.IdUDPServer1UDPRead(Sender: TObject; AData: TStream;
ABinding: TIdSocketHandle);
var buff:array[0..2050] of byte;
cmd:p_head;
list:tstringlist;
liststream:Tmemorystream;
posi,sendsize:integer;
file_trans:file_page;
begin
ip:=abinding.PeerIP;
adata.Read(buff,sizeof(adata.Size)); move(buff,cmd,sizeof(cmd));//读取包头;
case cmd of
filelist: //文件列表
begin
list:=tstringlist.Create;
liststream:=Tmemorystream.Create;
findfile('D:\',list);
list.SaveToStream(liststream);
liststream.SaveToFile('1.txt');
posi:=0;
while posi<liststream.Size do
begin
sendsize:=2000;
if sendsize>liststream.Size then sendsize:=liststream.Size;
file_trans.head:=server_filelist;
liststream.Read(file_trans.body,sendsize);
file_trans.size:= sendsize;
idudpserver1.SendBuffer(IP,8001,file_trans,sizeof(file_trans)); posi:=posi+sendsize;
end; label1.Caption:=inttostr(sizeof(file_trans));
file_trans.head:=filelist_over;
idudpserver1.SendBuffer(IP,8001,file_trans,sizeof(file_trans));
list.Free;
end;
end;
end;end.
为什么保存的文件是乱码呢?程序如何改啊,请指点?
定义数据包:
unit unit3;interface
type
p_head=(filelist,server_filelist,filelist_over);
cmd_page=packed record
cmd:p_head;
end;
file_page=packed record
head:p_head;
size:integer;
body:array[0..2000] of byte;
end;
implementationend.
=============
控制端:
unit Unit1;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Menus, StdCtrls, IdBaseComponent, IdComponent, IdUDPBase, IdSocketHandle,
IdUDPServer;type
TForm1 = class(TForm)
IdUDPServer1: TIdUDPServer;
Memo1: TMemo;
MainMenu1: TMainMenu;
N1: TMenuItem;
N2: TMenuItem;
Label1: TLabel;
Edit1: TEdit;
Button1: TButton;
procedure N1Click(Sender: TObject);
procedure N2Click(Sender: TObject);
procedure IdUDPServer1UDPRead(Sender: TObject; AData: TStream;
ABinding: TIdSocketHandle);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
ip:string;
end;var
Form1: TForm1;
liststream:Tmemorystream;
implementationuses Unit2,unit3;
{$R *.dfm}procedure TForm1.N1Click(Sender: TObject);
begin
form2.Show;
end;procedure TForm1.N2Click(Sender: TObject);
var cmd:cmd_page;
begin
cmd.cmd:=filelist;
idudpserver1.SendBuffer(ip,8002,cmd,sizeof(cmd));
end;procedure TForm1.IdUDPServer1UDPRead(Sender: TObject; AData: TStream;
ABinding: TIdSocketHandle);
var buff:array[0..2050] of byte;
head:p_head;
list:tstringlist;
i:integer;
filelist:^file_page;
stream:tstream;
str:string;
begin
adata.Read(buff,sizeof(adata.Size));
label1.Caption:=inttostr(adata.Size);
filelist:=@buff[0];
case filelist.head of
server_filelist: //文件列表
begin
liststream.Seek(0,2);
liststream.WriteBuffer(filelist.body,filelist.size);
end;
filelist_over://
begin liststream.Position:=0;
list:=tstringlist.Create;
list.LoadFromStream(liststream);
liststream.SaveToFile('1.txt'); {for i:=0 to list.Count-1 do
begin
memo1.Lines.Add(list.Strings[i]);
end; }
list.Free;
liststream.Clear;
end;
end;
end;procedure TForm1.FormCreate(Sender: TObject);
begin
liststream:=tmemorystream.Create;
end;end.
=========================
服务端:
unit Unit1;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, IdBaseComponent, IdComponent, IdUDPBase, IdUDPServer, StdCtrls,IdSocketHandle;type
TForm1 = class(TForm)
IdUDPServer1: TIdUDPServer;
Label1: TLabel;
procedure IdUDPServer1UDPRead(Sender: TObject; AData: TStream;
ABinding: TIdSocketHandle);
private
{ Private declarations }
public
{ Public declarations }
end;var
Form1: TForm1;
ip:string;
i:integer;
implementation
uses unit3;
{$R *.dfm}procedure findfile(path:string;list:tstringlist);
var h:thandle;
att:TWIN32FindData;
filename:string;
begin
if path[length(path)]<>'\' then path:=path+'\';
path:=path+'*.*';
h:=windows.FindFirstFile(pchar(path),att);
while h<>INVALID_HANDLE_VALUE do
begin
filename:=att.cFileName;
if (filename<>'.') and (filename<>'..') and (att.dwFileAttributes=FILE_ATTRIBUTE_DIRECTORY) then
begin
findfile(sysutils.ExtractFilePath(path)+filename,list); //目录
end
else if (filename<>'.') and (filename<>'..') and (att.dwFileAttributes<>FILE_ATTRIBUTE_DIRECTORY) then
begin
//文件
list.Add(sysutils.ExtractFilePath(path)+filename) ;
end;
if not windows.FindNextFile(h,att) then h:= INVALID_HANDLE_VALUE;//该目录下文件及目录已经遍历完毕;
end;
end;procedure TForm1.IdUDPServer1UDPRead(Sender: TObject; AData: TStream;
ABinding: TIdSocketHandle);
var buff:array[0..2050] of byte;
cmd:p_head;
list:tstringlist;
liststream:Tmemorystream;
posi,sendsize:integer;
file_trans:file_page;
begin
ip:=abinding.PeerIP;
adata.Read(buff,sizeof(adata.Size)); move(buff,cmd,sizeof(cmd));//读取包头;
case cmd of
filelist: //文件列表
begin
list:=tstringlist.Create;
liststream:=Tmemorystream.Create;
findfile('D:\',list);
list.SaveToStream(liststream);
liststream.SaveToFile('1.txt');
posi:=0;
while posi<liststream.Size do
begin
sendsize:=2000;
if sendsize>liststream.Size then sendsize:=liststream.Size;
file_trans.head:=server_filelist;
liststream.Read(file_trans.body,sendsize);
file_trans.size:= sendsize;
idudpserver1.SendBuffer(IP,8001,file_trans,sizeof(file_trans)); posi:=posi+sendsize;
end; label1.Caption:=inttostr(sizeof(file_trans));
file_trans.head:=filelist_over;
idudpserver1.SendBuffer(IP,8001,file_trans,sizeof(file_trans));
list.Free;
end;
end;
end;end.
为什么保存的文件是乱码呢?程序如何改啊,请指点?
而不是把所有数据接到一起再处理。