2013-05-16 18 views
0

你好我嘗試使用Indy組件與客戶端/服務器與TCP從客戶端發送文件到服務器知道文件的大小德爾福

我設法正確地發送和收到的文件發送一個文件通過TCP用delphi,問題是在發送文件之前,我想發送它的大小,並在我得到它的服務器後進行比較。

現在我發送文件從客戶端到服務器。

客戶:

Ms := TMemoryStream.Create; 
    Ms.LoadFromFile('cliente.exe'); 
    Ms.Position := 0; 

    Result := True; 
    Client.IOHandler.LargeStream := True; 
    try 
    Client.IOHandler.Write(ms, 0, True);// (Ms, 0, true); 
    except 
    Result := False; 
    end; 
    Ms.Free; 

服務器:

AStream := TFileStream.Create('C:\temp\file.exe', fmCreate + fmShareDenyNone); 
    try 
     AContext.Connection.IOHandler.LargeStream := True; 
     AContext.Connection.IOHandler.ReadStream(AStream, -1,false); 
    finally 
     FreeAndNil(AStream); 
     Memo1.Lines.Add('File received'); 
    end; 

所以現在的問題是我怎麼能與文件發送文件的大小?

+1

使用'Client.IOHandler.Write(ms.Size);'發送的MemoryStream和 'AContext.Connection.IOHandler.ReadInt64之前;讀取將MemoryStream – bummi

+0

THX很多之前',我媒體鏈接解決了與'TCPClient.IOHandler .WriteLn(inttostr(Ms.Size));'和 'sent_size:= strtoint(AContext.Connection.Socket.ReadLn());' – vexen

回答

0

您的代碼是已發送文件大小。您正在將AWriteByteCount參數Write(TStream)設置爲True,這表示它在發送流數據之前發送流大小。在讀取流數據之前,您正在告訴ReadStream()讀取流的大小。因此,在退出ReadStream()之前,Indy已經爲您確認了尺寸。你根本不需要手動去做。

+0

我以爲是一樣的,但我試過,它不工作我試圖切中場休息之前,它只是削減,並沒有提供任何錯誤,這似乎是正常的。這就是爲什麼我手動做到這一點 – vexen

+0

我向你保證,我描述的東西在正確使用時工作得很好。如果您提前切斷傳輸,接收器將最終會發生套接字讀取錯誤並引發異常。發件人可能會收到套接字錯誤,但這取決於操作系統出站緩衝區是否填滿。請記住,操作系統以及應用程序無法及時檢測到*異常*斷開連接,並且會高興地繼續接收數據並對其進行緩衝,直到最終檢測到斷開連接。 –

+0

你必須使用心跳/ Keepalive來處理*異常*斷線。至少,您應該啓用TCP級保持活動,例如通過'TIdSocketHandle.SetKeepAliveValues()'。 –

相關問題