【问题标题】:Sending data from TIdTCPClient to TServerSocket in FMX is not working for Delphi XE8在 FMX 中将数据从 TIdTCPClient 发送到 TServerSocket 不适用于 Delphi XE8
【发布时间】: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)。
  • 这样会更明智,是的。TServerSocketTClientSocket 是旧组件,始终使用 Indy。
  • 无论框架如何,TCP 都是 TCP,因此您不需要 TIdTCPServer,但建议使用。但是,没有接受 ^TSamplePacketPointer 作为参数值的 TIdIOHandler.Write() 的重载版本。该代码不应该在桌面或移动编译器中编译,更不用说运行了。除非你写了一个你没有展示的class helper。您也没有显示您的TServerSocket 代码。要回答您的其他问题,您可以在 IdGlobal 单元中使用 Indy 的 RawToBytes() 函数将打包记录转换为 TIdBytes

标签: delphi indy delphi-xe7 delphi-xe8


【解决方案1】:

应用程序A:此应用程序是使用Delphi XE8 作为VCL 应用程序开发的。此应用程序具有 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;

【讨论】:

  • 我已使用 RawToBytes 并发送数据。我从应用程序 B(具有 TIDTcpClientSockt)发送的数据在应用程序 A(具有 TServerSocket)中接收。非常感谢雷米。
  • 我有如下所示的记录。 TSamplePacket = 记录 strVal1:char 数组 [0..50]; strVal2:char数组[0..50];结尾;当我发送此数据包时,缺少最终值。我怎样才能发送更大的值(比如 250 个字符)?
  • @test12345:记录本身很好。如果您丢失了数据,则说明您没有正确发送和/或接收数据。随意发布一个新问题,并在两端显示您的实际代码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-02
  • 1970-01-01
  • 1970-01-01
  • 2012-03-15
  • 1970-01-01
相关资源
最近更新 更多