0

我正在使用带有 indy10 组件的 delphi xe4,我想将图像从 Tidudpclient 发送到 Tidudpserver。我已经使用 tcp 组件完成了此操作,但相同的代码不适用于 udp。我怎么能这样做?提前致谢!

Timage(客户端)--->streamUDP-->Timage(服务器)

客户端----------------------------------------------------------- 发送图片

var
    pic: tbitmap;
       Strm : TMemoryStream;
        img2:Timage;

    buffer:TIdBytes;
    begin

        try
          img2:=Timage.Create(nil);
          pic:=Tbitmap.Create;
          Takekpic(pic);     
          BMPtoJPG(pic,img2);
          Strm := TMemoryStream.Create;
          img2.Picture.bitmap.SaveToStream(strm);
          Strm.Position:=0;
          ReadTIdBytesFromStream(Strm,buffer,SizeOf(Strm),0);
          IdTrivialFTPServer1.SendBuffer('192.168.17.128',1234,buffer);
        finally
             strm.Free;
          end; 
    end;

服务器端 - - - - - - - - - - - - - - - - - - - - - - - - ---- 阅读图片

procedure TForm6.IdTrivialFTP1UDPRead(AThread: TIdUDPListenerThread;
  const AData: TIdBytes; ABinding: TIdSocketHandle);
    var
Strm : TMemoryStream;
Jpg: TJpegImage;

begin
      Strm := TMemoryStream.Create;
      try    

         WriteTIdBytesToStream(Strm,AData,SizeOf(AData),0);
         strm.Position:=0;
         Jpg := TJpegImage.Create;
         jpg.LoadFromStream(Strm);  <---- error while reading (JPEG Error #53)
         img1.Picture.assign(jpg);
      finally
         strm.Free;
         Jpg.Free;
      end;
end;

这段代码有什么问题?

4

1 回答 1

2

TIdUDPClient并且TIdUDPServer不支持发送/接收TStream数据。您可以将图像数据保存到 中TStream,但您必须使用TIdBytes块发送/接收它。

或者,使用TIdTrivialFTPandTIdTrivialFTPServer代替,它实现了基于 UDP 的文件传输协议 TFTP。他们使用TStream对象进行操作

更新:例如:

客户:

var
  bmp: TBitmap;
  jpg: TJPEGImage;
  Strm : TMemoryStream;
begin
  Strm := TMemoryStream.Create;
  try
    jpg := TJPEGImage.Create;
    try
      bmp := TBitmap.Create;
      try 
        Takekpic(bmp);     
        jpg.Assign(bmp);
      finally
        bmp.Free;
      end;
      jpg.SaveToStream(Strm);
    finally
      jpg.Free;
    end;
    Strm.Position := 0;
    {
    These can be assigned ahead of time...
    IdTrivialFTP1.Host := '192.168.17.128';
    IdTrivialFTP1.Port := 1234;
    }
    IdTrivialFTP1.Put(Strm, 'image.jpg');
  finally
    Strm.Free;
  end; 
end;

服务器:

procedure TForm6.IdTrivialFTPServer1WriteFile(Sender: TObject; var FileName: String; const PeerInfo: TPeerInfo; var GrantAccess: Boolean; var AStream: TStream; var FreeStreamOnComplete: Boolean) of object;
begin
  if FileName = 'image.jpg' then
  begin
    GrantAccess := True;
    AStream := TMemoryStream.Create;
    FreeStreamOnComplete := True;
  end else
    GrantAccess := False;
end;

{
If you set TIdTrivialFTPServer.ThreadedEvent to False, this event handler
runs in the context of the main thread, so the UI can be accessed safely.
If you set IdTrivialFTPServer.ThreadedEvent to True, this event handler
runs in the context of a worker thread, so you will have to manually
synchronize with the main thread when updating the UI...
}
procedure TForm6.IdTrivialFTPServer1TransferComplete(Sender: TObject; const Success: Boolean; const PeerInfo: TPeerInfo; var AStream: TStream; const WriteOperation: Boolean);
var
  jpg: TJPEGImage;
begin
  if WriteOperation and Success then
  begin
    jpg := TJPEGImage.Create;
    try
      AStream.Position := 0;
      jpg.LoadFromStream(AStream);
      img1.Picture.Assign(jpg);
    finally
      jpg.Free;
    end;
  end;
end;
于 2013-07-04T15:20:39.777 回答