Delphi移动应用程序通过Tidtcpclient发送图像(连接正常关闭)

Delphi移动应用程序通过Tidtcpclient发送图像(连接正常关闭),delphi,firemonkey,Delphi,Firemonkey,我正在使用Delphi10.2并构建一个移动应用程序 我的任务之一是将图像从移动设备发送到服务器 我从stackoverflow获得了一个代码来执行此操作并运行它,但它不起作用 执行时的服务器端代码 type TSendRec = record SONo: string; Text: string; Bitmap: TBitmap; end; procedure TForm1.IdTCPServer1Execute(AContext: TIdContext);

我正在使用Delphi10.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

这都是正常行为。
TIdTCPServer
是一个多线程组件。当客户端连接时,它在自己的工作线程中运行。
TIdTCPServer.OnExecute
事件在套接字连接的生存期内,在该线程的上下文中以连续循环的方式触发

客户端发送映像流后,它将断开与服务器的连接

服务器读取映像流后,将退出
OnExecute
事件处理程序。处理程序将再次启动,调用
ReadLn()
,这将检测到断开连接并引发
eidconclosedgracefully
异常

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



仅供参考,另一方面,FMX的
TBitmap.SaveTo…()
方法的默认图像格式是PNG,而不是BMP。

感谢您的重播,但您是否有任何示例用于发送类似于此类型的记录数据类型TSendRec=record SONo:string;文本:字符串;位图:TBitmap;结束;通过TIdHTTP/TIdHTTPServerFWIW,异常不一定是错误。它们最常用于处理错误,但异常不是错误。也有一些很好的例外,比如这个。只有当你在调试模式下运行你的应用程序时,你才能看到它。亲爱的Remy,thx为你提供帮助,请你澄清你的评论“让服务器处理异常,这样它就可以关闭套接字并停止管理套接字的线程”告诉我更多细节,我可以在代码中添加什么来解决this@aoemam没有什么需要补充的,因为没有什么需要解决的。代码运行正常。如果在套接字连接关闭后执行读/写操作,Indy将引发异常。就让它发生吧,不要捕获异常(或者如果捕获,则重新引发异常),而
TIdTCPServer
将在内部为您处理它。现在我的问题是服务器端应用程序在AContext.Connection.IOHandler.ReadStream(ms,-1,False)处停止;备忘录中没有填写手机发送的数据,也没有收到图像。我想告诉你,我试图忽略发送图像,只发送字符串。同样的错误,没有新的操作。代码很好,如图所示。写入和读取正确平衡。除非数据没有通过网络正确传输,否则代码没有理由阻塞。使用网络嗅探器进行验证。嗨,雷米,谢谢你,我感谢你的努力,最后通过将LoadFromStream(ms)放进去工作;在最后的努力下