在 FMX 中将数据从 TIdTCPClient 发送到 TServerSocket 不适用于 Delphi XE8
Sending data from TIdTCPClient to TServerSocket in FMX is not working for Delphi XE8
我正在使用 Delphi XE8 试用版来开发应用程序移动应用程序。目前我面临非常严重的问题,下面我已经解释清楚了。
我的项目分为两个不同的应用程序:
应用程序A:此应用程序是使用Delphi XE8 作为VCL 应用程序开发的。这个应用程序有 TServerSocket。并使用字节数组接收数据。大多数情况下,此应用程序将数据作为打包记录接收,并根据消息 Header 进行下一步。
应用程序 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 多设备移动应用程序中调用 SendData 程序时,它没有在服务器应用程序中收到任何数据,并且在客户端中也没有引发异常。我已经检查了 Windows 7 桌面和 Android 移动 Lolipop 版本移动。在这两种设备中,客户端应用程序都没有发送数据。同样的代码在 Delphi XE7 中适用于 Windows 应用程序和 Android KitKat 版本移动应用程序。在 Delphi XE8 多设备移动应用程序中,我尝试将打包记录转换为 TIDBytes。但我不知道该怎么做。?
但是当我创建 Delphi XC8 VCL 应用程序并实现相同的代码和相同的组件时,我尝试发送数据,它在服务器应用程序中接收数据。
并且在 Delphi XE8 多设备移动应用程序中,如果我尝试发送如下所示的文本:
IdTCPClient1.IOHandler.Writeln('test');
当我使用它时,我可以在服务器应用程序中接收数据。
请帮助我将此缓冲区数据正确发送到服务器套接字。提前致谢
Application A: This application is developed using Delphi XE8 as VCL application. This application has the 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;
我正在使用 Delphi XE8 试用版来开发应用程序移动应用程序。目前我面临非常严重的问题,下面我已经解释清楚了。
我的项目分为两个不同的应用程序:
应用程序A:此应用程序是使用Delphi XE8 作为VCL 应用程序开发的。这个应用程序有 TServerSocket。并使用字节数组接收数据。大多数情况下,此应用程序将数据作为打包记录接收,并根据消息 Header 进行下一步。
应用程序 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 多设备移动应用程序中调用 SendData 程序时,它没有在服务器应用程序中收到任何数据,并且在客户端中也没有引发异常。我已经检查了 Windows 7 桌面和 Android 移动 Lolipop 版本移动。在这两种设备中,客户端应用程序都没有发送数据。同样的代码在 Delphi XE7 中适用于 Windows 应用程序和 Android KitKat 版本移动应用程序。在 Delphi XE8 多设备移动应用程序中,我尝试将打包记录转换为 TIDBytes。但我不知道该怎么做。?
但是当我创建 Delphi XC8 VCL 应用程序并实现相同的代码和相同的组件时,我尝试发送数据,它在服务器应用程序中接收数据。
并且在 Delphi XE8 多设备移动应用程序中,如果我尝试发送如下所示的文本:
IdTCPClient1.IOHandler.Writeln('test');
当我使用它时,我可以在服务器应用程序中接收数据。
请帮助我将此缓冲区数据正确发送到服务器套接字。提前致谢
Application A: This application is developed using Delphi XE8 as VCL application. This application has the 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;