Delphi Mobile App通过Tidtcpclient发送图像(连接正常关闭)

时间:2017-09-12 14:05:05

标签: delphi firemonkey

我正在使用Delphi 10.2并构建移动应用程序 我的任务之一是将图像从手机发送到服务器 我从stackoverflow获取代码来执行此操作并运行它但它无法正常工作

执行时的服务器端代码

type
  TSendRec = record
    SONo: string;
    Text: string;
    Bitmap: TBitmap;
  end;


procedure TForm1.IdTCPServer1Execute(AContext: TIdContext);
var
  MIRec: TSendRec;
  ms: TMemoryStream;
begin
  try
  MIRec.SONo := AContext.Connection.IOHandler.ReadLn;
  MIRec.Text := AContext.Connection.IOHandler.ReadLn;
  MIRec.Bitmap := TBitmap.Create;

    ms := TMemoryStream.Create;
    try
      AContext.Connection.IOHandler.LargeStream := True;
      AContext.Connection.IOHandler.ReadStream(ms, -1, False);
      ms.Position := 0;
      MIRec.Bitmap.LoadFromStream(ms);
    finally
      ms.Free;
    end;
    TThread.Synchronize(nil,
      procedure
      begin
        Memo1.Lines.Add(MIRec.SONo);
        Memo1.Lines.Add(MIRec.Text);
        MIRec.Bitmap.SaveToFile('C:\To Receive\test.bmp');
      end
      );
  finally
    MIRec.Bitmap.Free;
  end;
end;

,客户端代码

procedure TForm2.Button2Click(Sender: TObject);
var
  MIRec: TSendRec;
  ms: TMemoryStream;
begin
  MIRec.SONo := IntToStr(Ticket_ID);
  MIRec.Text := 'Pic_'+IntToStr(Ticket_ID);
  MIRec.Bitmap := TBitmap.Create;
  MIRec.Bitmap.Assign(imgPhotoLibraryImage.Bitmap);
  try
    IdTCPClient1.Connect;
    try
      IdTCPClient1.IOHandler.WriteLn(MIRec.SONo);
      IdTCPClient1.IOHandler.WriteLn(MIRec.Text);
      ms := TMemoryStream.Create;
      try
        MIRec.Bitmap.SaveToStream(ms);
        IdTCPClient1.IOHandler.LargeStream := True;
        IdTCPClient1.IOHandler.Write(ms, 0, True);
        ShowMessage('Image Uploaded');
        imgPhotoLibraryImage.Bitmap.Assign(nil);
      finally
        ms.Free;
      end;
    finally
      IdTCPClient1.Disconnect;
    end;
  finally
    MIRec.Bitmap.Free;
  end;
end;

现在在服务器端我收到错误正常关闭连接

任何帮助PLZ

1 个答案:

答案 0 :(得分:3)

这是正常行为。

str2func是一个多线程组件。当客户端连接时,它在自己的工作线程中运行。 eval事件在套接字连接的生命周期的连续循环中在该线程的上下文中触发。

客户端发送图像流后,它会与服务器断开连接。

服务器读取图像流后,它将退出TIdTCPServer事件处理程序。处理程序将再次触发,调用TIdTCPServer.OnExecute,它将检测断开连接并引发OnExecute异常。

这是正常行为。让异常转义事件处理程序。不要抓住它(或者,如果你这样做,一定要重新抬起它)。 ReadLn()将为您处理异常,关闭客户端套接字并停止管理套接字的线程。

仅供参考,侧面说明,FMX的EIdConnClosedGracefully方法的默认图像格式为PNG,而非BMP。