【发布时间】:2015-07-14 17:38:45
【问题描述】:
我正在使用 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');
当我使用它时,我可以在服务器应用程序中接收数据。
请提供任何帮助以将此缓冲区数据正确发送到服务器套接字。并提前感谢
【问题讨论】:
-
我是否需要为应用程序 B 使用 TIDTcpServer 组件而不是 TServerSocket(具有 TServerSocket)。
-
这样会更明智,是的。
TServerSocket和TClientSocket是旧组件,始终使用 Indy。 -
无论框架如何,TCP 都是 TCP,因此您不需要
TIdTCPServer,但建议使用。但是,没有接受^TSamplePacket或Pointer作为参数值的TIdIOHandler.Write()的重载版本。该代码不应该在桌面或移动编译器中编译,更不用说运行了。除非你写了一个你没有展示的class helper。您也没有显示您的TServerSocket代码。要回答您的其他问题,您可以在IdGlobal单元中使用 Indy 的RawToBytes()函数将打包记录转换为TIdBytes。
标签: delphi indy delphi-xe7 delphi-xe8