我使用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');
当我使用它时,我能够在服务器应用程序中接收数据。
请帮我把这个缓冲区数据正确发送到服务器套接字。并提前致谢
答案 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;