在 FMX 中将数据从 TIdTCPClient 发送到 TServerSocket 不适用于 Delphi XE8

Sending data from TIdTCPClient to TServerSocket in FMX is not working for Delphi XE8

我正在使用 Delphi XE8 试用版来开发应用程序移动应用程序。目前我面临非常严重的问题,下面我已经解释清楚了。

我的项目分为两个不同的应用程序:

应用程序A:此应用程序是使用Delphi XE8 作为VCL 应用程序开发的。这个应用程序有 TServerSocket。并使用字节数组接收数据。大多数情况下,此应用程序将数据作为打包记录接收,并根据消息 Header 进行下一步。

应用程序 B:此应用程序是使用 Delphi XE8 作为多设备移动应用程序开发的。这个应用程序有 TIdTCPClient。并发送如下所述的数据:

TSamplePacket = packed record
  strValue: array [0..10] of Char;
end;

Procedure SendData;
var
  SamplePacket: TSamplePacket;
begin
  SamplePacket.strValue := '1000';
  IdTCPClient1.IOHandler.Write(@SamplePacket, SizeOf(TSamplePacket));
end;

并且对于 IdTCPClient,分配了 IOHandler。

问题: 当我在 Delphi XE8 多设备移动应用程序中调用 SendData 程序时,它没有在服务器应用程序中收到任何数据,并且在客户端中也没有引发异常。我已经检查了 Windows 7 桌面和 Android 移动 Lolipop 版本移动。在这两种设备中,客户端应用程序都没有发送数据。同样的代码在 Delphi XE7 中适用于 Windows 应用程序和 Android KitKat 版本移动应用程序。在 Delphi XE8 多设备移动应用程序中,我尝试将打包记录转换为 TIDBytes。但我不知道该怎么做。?

但是当我创建 Delphi XC8 VCL 应用程序并实现相同的代码和相同的组件时,我尝试发送数据,它在服务器应用程序中接收数据。

并且在 Delphi XE8 多设备移动应用程序中,如果我尝试发送如下所示的文本:

IdTCPClient1.IOHandler.Writeln('test');

当我使用它时,我可以在服务器应用程序中接收数据。

请帮助我将此缓冲区数据正确发送到服务器套接字。提前致谢

Application A: This application is developed using Delphi XE8 as VCL application. This application has the TServerSocket.

TServerSocket 已弃用多年,默认情况下不再安装。提供它只是为了与旧代码向后兼容。由于无论如何您都在使用 Indy,因此您应该考虑改用 TIdTCPServer

IdTCPClient1.IOHandler.Write(@SamplePacket, SizeOf(TSamplePacket));

TIdIOHandler.Write() 没有接受此类参数值的重载版本。您需要将数据作为 TIdBytes:

发送
Procedure SendData;
var
  SamplePacket: TSamplePacket;
begin
  SamplePacket.strValue := '1000';
  IdTCPClient1.IOHandler.Write(RawToBytes(SamplePacket, SizeOf(TSamplePacket)));
end;

或作为 TStream:

Procedure SendData;
var
  SamplePacket: TSamplePacket;
  Strm: TIdMemoryBufferStream;
begin
  SamplePacket.strValue := '1000';
  Strm: TIdMemoryBufferStream.Create(@SamplePacket, SizeOf(TSamplePacket));
  try
    IdTCPClient1.IOHandler.Write(Strm);
  finally
    Strm.Free;
  end;
end;