【问题标题】:Need to send data from TServersocket to TidTcpClient需要从 TServersocket 向 TidTcpClient 发送数据
【发布时间】:2015-06-25 06:26:24
【问题描述】:

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

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

  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;

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

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

【问题讨论】:

  • TServerSocket 组件已经过时和弃用了很长时间。我建议在服务器端使用 Indy。
  • I'm getting the exception ...实际的异常类和消息是什么?
  • 我在客户端应用程序(移动)中正常关闭异常。

标签: sockets delphi indy delphi-xe8 tfilestream


【解决方案1】:

问题是当我采用这种方法时,它需要将近 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属性) 从套接字中读取,并将其用作字节数来完成对流的其余部分的读取。 TCustomWinSocket.SendStream() 没有发送任何这样的大小值。

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

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

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

【讨论】:

    猜你喜欢
    • 2015-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-02
    • 2016-11-17
    • 1970-01-01
    • 2016-09-20
    • 2019-01-11
    相关资源
    最近更新 更多