这是SERVER端的代码:procedure TForm1.SpeedButton1Click(Sender: TObject);
begin
opendialog1.Filter:='*.*|*.*';
if opendialog1.Execute then
begin
filename:=opendialog1.FileName;
myfile:=tfilestream.Create(filename,fmopenread);
end;
end;procedure TForm1.SpeedButton2Click(Sender: TObject);
begin
NMUDP1.RemoteHost:=edit1.text;
myfile.Position := 0;
NMUDP1.SendStream(myfile);
end;

解决方案 »

  1.   

    这是Client端的代码:procedure TForm1.NMUDP1DataReceived(Sender: TComponent;
      NumberBytes: Integer; FromIP: String; Port: Integer);
    var
      vMemoryStream: TmemoryStream;
    begin
      vMemoryStream := TmemoryStream.Create;
      try
        NMUDP1.ReadStream(vMemoryStream);
        vMemoryStream.Position := 0;
        vMemoryStream.SaveToFile('c:\temp.dat');
      finally
        vMemoryStream.Free;
      end;
      end;
      

  2.   

    这个结出一种方法.
    把文件分为定长的小块,给每小块编上号,
    一个UDP报文传一小块,接收方把接收到的块按顺序拼接..同时,把未接收到的块发出重传请求.因为UDP是不可靠传输,必须采取一定措施控制.
      

  3.   

    1 发送时加包头,记录包的序号
    2 接收时进行缓冲,防止因为时延大而丢包,缓冲的大小和你预计的时延成正比
    3 如果是要求可靠的传输,还要加重发机制,这就要在包头中加包的类型编码,处理流程就很复杂了,可参看并模拟TCP的处理方法。