1

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

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

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

应用程序 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 Multidevice 移动应用程序中调用 SendData 程序时,它没有在服务器应用程序中收到任何数据,客户端也没有引发异常。我已经检查了 Windows 7 桌面和 Android 移动 Lolipop 版本的移动。在这两种设备中,客户端应用程序都不会发送数据。同样的代码在 Delphi XE7 for Windows 应用程序和 Android KitKat 版本的移动应用程序中运行良好。在 Delphi XE8 Multi Device 移动应用程序中,我尝试将打包记录转换为 TIDBytes。但我不知道该怎么做。?

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

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

IdTCPClient1.IOHandler.Writeln('test');

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

请提供任何帮助以将此缓冲区数据正确发送到服务器套接字。并提前感谢

4

1 回答 1

2

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

TServerSocket has been deprecated for years, and is no longer installed by default. It is provided only for backwards compatibility with old code. Since you are using Indy anyway, you should consider using TIdTCPServer instead.

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

There is no overloaded version of TIdIOHandler.Write() that accepts such parameter values. You need to send the data as a TIdBytes:

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

Or as a 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;
于 2015-05-05T07:59:45.833 回答