我正在使用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移动版。在两个设备中,客户端应用程序均未发送数据。同样的代码在Windows应用程序和Android KitKat版本的移动应用程序的Delphi XE7中也能正常工作。在Delphi XE8 Multi Device移动应用程序中,我尝试将打包的记录转换为TIDBytes。但是我不知道该怎么做。
但是,当我创建了Delphi XC8 VCL应用程序并实现了相同的代码和相同的组件,并且尝试发送数据时,它会在Server应用程序中接收数据。
在Delphi XE8 Multidevice移动应用程序中,如果我尝试发送如下所示的文本:
IdTCPClient1.IOHandler.Writeln('test');
当我使用它时,我可以在服务器应用程序中接收数据。
请提供任何帮助,以将缓冲区数据正确发送到服务器套接字。并预先感谢
应用程序A:此应用程序是使用Delphi XE8作为VCL应用程序开发的。该应用程序具有TServerSocket。
TServerSocket
已被弃用多年,并且默认情况下不再安装。提供它仅是为了与旧代码向后兼容。由于无论如何都在使用Indy,因此应考虑改用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;
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句