簡體   English   中英

需要將數據從TServersocket發送到TidTcpClient

[英]Need to send data from TServersocket to TidTcpClient

我正在使用Delphi XE8開發移動應用程序和桌面應用程序。 在移動應用程序中,我使用的是TIDtcpClient組件,在桌面應用程序中,我使用的是TServerSocket。

Server Desktop應用程序包含TList,其中包含約1500條記錄。 為了在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;

而且,當我使用上述方法時,出現異常,並且無法檢索數據。

請提供任何解決方案,以更快地從服務器到客戶端檢索數據。

問題是,當我遵循此方法時,將花費近2分鍾的時間,並且我會正確地獲取所有數據。

您沒有顯示/解釋在那種情況下發送數據所使用的實際I / O方法。

因此,我決定使用文件流方法...當我使用上述方法時,我得到了[客戶端應用程序(移動)中的“優雅關閉異常”),我無法檢索數據

TCustomWinSocket.SendStream()僅按TStream發送TCustomWinSocket.SendStream()的內容,不發送其他任何內容。

您正在將未初始化的變量 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變量來覆蓋該行為,因此該行為是不確定的。

您的服務器沒有在發送流數據之前發送流大小,因此,除非您在發送流之后斷開套接字的連接,否則客戶端無法知道需要多少字節。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM