我用udp写了个简单的文件传输,我是看别人的例子写的,不知道为什么会丢包,传文件的时候接收的文件总是比实际发送的文件要少几十kb。
代码如下服务器的:
unit server_Unit1;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, IdBaseComponent, IdComponent, IdUDPBase, IdUDPServer,IdSocketHandle,
StdCtrls;type
TForm1 = class(TForm)
IdUDPServer1: TIdUDPServer;
ListBox1: TListBox;
procedure IdUDPServer1UDPRead(Sender: TObject; AData: TStream;
ABinding: TIdSocketHandle);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;var
Form1: TForm1;
f:TFileStream;
implementation{$R *.dfm}procedure TForm1.IdUDPServer1UDPRead(Sender: TObject; AData: TStream;
ABinding: TIdSocketHandle);
begin
Adata.Seek(0,0);
f.CopyFrom(Adata,Adata.Size);
self.ListBox1.Items.Add(inttostr(f.Position));
end;procedure TForm1.FormCreate(Sender: TObject);
begin
f:=Tfilestream.Create('c:\111.txt',fmcreate);
end;end.客户端的:
unit client_Unit1;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, IdBaseComponent, IdComponent, IdUDPBase, IdUDPClient, StdCtrls;type
TForm1 = class(TForm)
IdUDPClient1: TIdUDPClient;
OpenDialog1: TOpenDialog;
Button1: TButton;
ListBox1: TListBox;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;var
Form1: TForm1;
fstream:TFilestream;
i,len:integer;
sendx:array[0..1023] of byte;
implementation{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);
begin
self.IdUDPClient1.Active:=true;
if self.OpenDialog1.Execute then
begin
fstream:=TFilestream.Create(self.OpenDialog1.FileName,fmOpenRead);
i:=0;
len:=1024;
while i<fstream.Size do
begin
if fstream.Size-i<len then
begin
len:= fstream.Size-i;
end;
fstream.Read(sendx,len);
self.IdUDPClient1.SendBuffer(sendx,len);
self.ListBox1.Items.Add(inttostr(fstream.Position));
inc(i,len);
end;
end;
end;end.
代码如下服务器的:
unit server_Unit1;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, IdBaseComponent, IdComponent, IdUDPBase, IdUDPServer,IdSocketHandle,
StdCtrls;type
TForm1 = class(TForm)
IdUDPServer1: TIdUDPServer;
ListBox1: TListBox;
procedure IdUDPServer1UDPRead(Sender: TObject; AData: TStream;
ABinding: TIdSocketHandle);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;var
Form1: TForm1;
f:TFileStream;
implementation{$R *.dfm}procedure TForm1.IdUDPServer1UDPRead(Sender: TObject; AData: TStream;
ABinding: TIdSocketHandle);
begin
Adata.Seek(0,0);
f.CopyFrom(Adata,Adata.Size);
self.ListBox1.Items.Add(inttostr(f.Position));
end;procedure TForm1.FormCreate(Sender: TObject);
begin
f:=Tfilestream.Create('c:\111.txt',fmcreate);
end;end.客户端的:
unit client_Unit1;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, IdBaseComponent, IdComponent, IdUDPBase, IdUDPClient, StdCtrls;type
TForm1 = class(TForm)
IdUDPClient1: TIdUDPClient;
OpenDialog1: TOpenDialog;
Button1: TButton;
ListBox1: TListBox;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;var
Form1: TForm1;
fstream:TFilestream;
i,len:integer;
sendx:array[0..1023] of byte;
implementation{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);
begin
self.IdUDPClient1.Active:=true;
if self.OpenDialog1.Execute then
begin
fstream:=TFilestream.Create(self.OpenDialog1.FileName,fmOpenRead);
i:=0;
len:=1024;
while i<fstream.Size do
begin
if fstream.Size-i<len then
begin
len:= fstream.Size-i;
end;
fstream.Read(sendx,len);
self.IdUDPClient1.SendBuffer(sendx,len);
self.ListBox1.Items.Add(inttostr(fstream.Position));
inc(i,len);
end;
end;
end;end.
你要用udp来传输文件的话,就需要自己在应用层做可靠性保证。
.....