![](/img/trans.png)
[英]¿How can I send and recieve strings from tidtcpclient and tidtcpserver and to create a chat?
[英]Need to send data from TServersocket to TidTcpClient
我正在使用Delphi XE8開發移動應用程序和桌面應用程序。 在移動應用程序中,我使用的是TIDtcpClient組件,在桌面應用程序中,我使用的是TServerSocket。
Server Desktop應用程序包含TList,其中包含約1500條記錄。 為了在Client Mobile應用程序中獲取這些值,我使用以下方法。
問題是,當我遵循此方法時,將花費近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
碰巧是< 0
, ReadStream()
只會忽略字節數,只是繼續讀取直到套接字斷開連接( AReadUntilDisconnect
被強制為True)。
TIdIOHandler.ReadStream()
的默認行為是期望流數據之前帶有流大小,但是您通過傳遞未初始化的i
變量來覆蓋該行為,因此該行為是不確定的。
您的服務器沒有在發送流數據之前發送流大小,因此,除非您在發送流之后斷開套接字的連接,否則客戶端無法知道需要多少字節。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.