需要将数据从TServersocket发送到TidTcpClient



我使用Delphi XE8开发移动应用程序和桌面应用程序。在移动应用程序中,我使用TIDtcpClient组件,在桌面应用程序中使用TServerSocket。

服务器桌面应用程序包含TList,其中包含大约1500条记录。为了在ClientMobile应用程序中获得这些值,我使用了以下方法。

  1. 首先,下载请求从客户端移动应用程序发送到服务器应用程序
  2. 接下来,它检索10条记录并发送回客户端移动应用程序。之后,它会更新客户端列表中的值,然后再次将请求发送回服务器应用程序
  3. 在达到记录计数之前,此过程将继续

问题是,当我使用这种方法时,几乎需要2分钟的时间,而且我可以正确地获取所有数据。因此,我决定使用文件流方法。下面我提到了示例代码:

服务器端应用程序:

//first saved the List into FileStream & it is working as I have reloaded and checked
//So again I'm loading the saved file, The file Size is near to 400KB
FileStream := TFileStream.Create('D:ListDet.dat', mtfmOpenRead);
Socket.SendStream(FileStream);

客户端移动应用程序:

var 
  FileS: TFileStread;
  i: Size;
begin
//Inside the thread
  TiDTcpClient.IOHandler.ReadStream(FileS, i);
end;

当我使用上述方法时,我会得到异常,并且无法检索数据。

请为我提供任何解决方案,以便更快地从服务器检索到客户端

问题是,当我使用这种方法时,几乎需要2分钟的时间,而且我可以正确地获取所有数据。

您没有显示/解释在这种情况下用于发送数据的实际I/O方法。

所以我决定使用文件流方法。。。当我使用上述方法时,我会得到[在客户端应用程序(移动)中优雅地关闭异常],并且我无法检索数据

TCustomWinSocket.SendStream()只是按原样发送TStream的内容,它不发送任何其他内容。

您正在将未初始化的变量i传递给TIdIOHandler.ReadStream()。这个参数告诉ReadStream()要读取多少字节。由于i是未初始化的,因此它的值是此时堆栈上发生的任何随机数据。

如果i在运行时恰好是> 0,那么ReadStream()将尝试读取多少字节。如果实际上没有发送那么多字节,ReadStream()将阻止调用线程等待更多字节,直到它的ReadTimeout过去(默认情况下是无限的)或套接字断开连接。

如果i恰好是-1(默认情况下AReadUntilDisconnect参数为False),则ReadStream()将尝试从套接字读取Integer/Int64(取决于TIdIOHandler.LargeStream属性),并将其用作字节计数以完成对流的其余部分的读取。CCD_ 19不发送任何这样的大小值。

如果i恰好是< 0,则ReadStream()将简单地忽略字节计数并继续读取,直到套接字断开(AReadUntilDisconnect被强制为True)。

TIdIOHandler.ReadStream()的默认行为是期望流数据前面有流大小,但您通过传递未初始化的i变量来覆盖该行为,因此该行为是未定义的。

您的服务器在发送流数据之前不会发送流大小,因此客户端无法知道需要多少字节,除非您在发送流后断开套接字。

相关内容

  • 没有找到相关文章

最新更新