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

时间:2015-05-05 06:02:08

标签: delphi indy delphi-xe7 delphi-xe8

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

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

应用程序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应用程序并实现相同的代码和相同的组件并尝试发送数据时,它会在Server应用程序中接收数据。

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

IdTCPClient1.IOHandler.Writeln('test');

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

请帮我把这个缓冲区数据正确发送到服务器套接字。并提前致谢

1 个答案:

答案 0 :(得分:2)

  

应用程序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;