传文件需要另外的控件,可以使用NMStrm、NMStrmServ,非常简单的
我的程序使用了一个NMStrm和一个NMStrmServ控件//自定义的传送文件的函数
procedure TMainForm.SendFile(const ip: ipstr; const filename: Shortstring);
var
  MyFStream: TFileStream;
Begin
  MyFStream := TFileStream.Create(filename, fmOpenRead);
  try
    NMStrm.Host:=ip;
    NMStrm.FromName:=ExtractFileName(filename);
    NMStrm.PostIt(MyFStream);
  finally
    MyFStream.Free;
  end;
end;//NMStrmServ的ONMsg事件处理程序
procedure TMainForm.NMStrmServMSG(Sender: TComponent; const sFrom: String;
  strm: TStream);
var
  MyFStream: TFileStream;
begin
    SaveDialog.Title:='保存别人发送来的文件: '+sFrom;
    SaveDialog.Filter:='所有文件|*.*';
    SaveDialog.InitialDir:=YMessagePath;
    SaveDialog.FileName:=sFrom;
    if (pos('\',sFrom)>0) or SaveDialog.Execute then begin
      If FileExists(SaveDialog.FileName) then DeleteFile(SaveDialog.FileName);
      MyFStream := TFileStream.Create(SaveDialog.FileName, fmCreate);
      try
        MyFStream.CopyFrom(strm, strm.size);
      finally
        MYFStream.Free;
      end;
      if (pos('\',sFrom)=0) and
         FileExists(SaveDialog.FileName) and
         (Application.MessageBox(PChar('现在打开(运行)刚才收到的文件吗?'#13#10'文件名: '+SaveDialog.FileName),ProgramTitle,MB_YESNO)=IDYES)
      then ShellExecute(0,nil,PChar(SaveDialog.FileName),Nil, Nil, SW_MAXIMIZE);
    end;
end;我在UDP数据里面设置了一个标志位,收到数据的时候根据标志位区别处理,比如
readbuffer(...);
flag:=buffer[0];
msg:=buffer+1;
case flag of
  '0': ShowReceivedMsg(msg);//收到消息,显示
  '1': //是否接收文件
....
end;