//客户端
var
    leftsize:integer;
    sendsize:integer;
    streamsize:integer;
    bufsize:integer;
    sendstream:tmemorystream;
    stream:tmemorystream;
procedure TForm1.Button2Click(Sender: TObject);
begin
  form1.screencap(0,0,100,100);//截屏,数据存在stream里
  streamsize:=stream.Size;
  leftsize:=streamsize;
  bufsize:=form1.IdUDPClient1.BufferSize;//form1.IdUDPClient1.BufferSize=2048
  form1.IdUDPClient1.Active:=true;
  sendstream:=tmemorystream.Create;
  while leftsize>0 do
   begin
    if(leftsize>bufsize) then
    begin
     leftsize:=leftsize-bufsize;
     sendsize:=bufsize;
    end
    else
    begin
     sendsize:=leftsize;
      leftsize:=0;
    end;
    sendstream.CopyFrom(stream,sendsize);     
    form1.Memo1.Lines.Add(inttostr(sendsize)+'  '+inttostr(stream.Position) );//记录发送的数据,结果显示全部发出去了
    sendstream.Position:=0;
    form1.IdUDPClient1.SendBuffer('127.0.0.1',2000,sendstream.Memory^,sendsize);
   end;
   sendstream.Clear;
   stream.Clear;
end;//服务端
var
  tmpstream:TStringStream;
procedure TForm1.Button3Click(Sender: TObject);
begin
form1.IdUDPServer1.DefaultPort:=2000;
tmpstream:=TStringStream.Create('');
form1.IdUDPServer1.Active:=true;
end;procedure TForm1.IdUDPServer1UDPRead(Sender: TObject; AData: TStream;
  ABinding: TIdSocketHandle);
begin  try
    tmpstream.CopyFrom(adata,adata.Size);
    if adata.Size<form1.IdUDPServer1.BufferSize then
    begin
       tmpstream.Position:=0;
       form1.Image1.Picture.Bitmap.LoadFromStream(tmpstream);
    end;
  except
    showmessage('except');
  end;  form1.Memo2.Lines.Add(inttostr(adata.Size));//记录接收到的数据包,结果显示只接收到部份数据包
end;

解决方案 »

  1.   

    // 如果把客房端修改成如下,服务端就能正常显示 ,不知道为什么,求助!!!
    var
        leftsize:integer;
        sendsize:integer;
        streamsize:integer;
        bufsize:integer;
        sendstream:tmemorystream;
        stream:tmemorystream;
    procedure TForm1.Button2Click(Sender: TObject);
    begin
      form1.screencap(0,0,100,100);//截屏,数据存在stream里
      streamsize:=stream.Size;
      leftsize:=streamsize;
      bufsize:=form1.IdUDPClient1.BufferSize;//form1.IdUDPClient1.BufferSize=2048
      form1.IdUDPClient1.Active:=true;
      sendstream:=tmemorystream.Create;
      form1.Timer1.Enabled:=true;
    end;procedure TForm1.Timer1Timer(Sender: TObject);
    begin
    if(leftsize>bufsize) then
     begin
    leftsize:=leftsize-bufsize;
    sendsize:=bufsize;
     end
     else
     begin
    sendsize:=leftsize;
      leftsize:=0;
     end;
    sendstream.CopyFrom(stream,sendsize);
    form1.Memo1.Lines.Add(inttostr(stream.Position) );
    sendstream.Position:=0;
    form1.IdUDPClient1.SendBuffer('127.0.0.1',2000,sendstream.Memory^,sendsize);
    if(leftsize=0) then
    begin
      form1.Timer1.Enabled:=false;
      stream.Clear;
    end;
    end;
      

  2.   

    socket缓冲区的大小有限制,建议每个UDP包不超过4K,每个包的间隔>10ms即可,可以封装一个发送线程。另外,对UDP这么简单的通信,就不要用什么组件了,直接用API,清楚直接。