簡體   English   中英

重用 TcpClient 和 NetworkStream 會導致錯誤的數據

[英]Reusing TcpClient and NetworkStream results in wrong data

我正在 WPF 上編寫屏幕鏡像應用程序。 我的原始代碼通過 TCP 從服務器向客戶端發送 bitmap。 原始代碼工作正常,但每次發送幀時都會關閉並重新創建 tcp 連接。 這導致每秒打開和關閉 30 個套接字,我認為這不是理想的方法。

所以我嘗試重寫它以在每次發送數據時重用stream,但是stream在一段時間后開始吐出錯誤的數據。

public void SendStream(byte[] byteArray)
{
    /*
    _client = IsServer ? _server.AcceptTcpClient() : new TcpClient(IP.ToString(), Port);
    using (var clientStream = _client.GetStream())
    {
        var comp = Compress(byteArray);
        clientStream.Write(comp, 0, comp.Length);
    }
    */

    var comp = Compress(byteArray);
    _stream.Write(BitConverter.GetBytes(comp.Length), 0, 4);
    _stream.Write(comp, 0, comp.Length);
}

public byte[] ReceiveStream()
{
    /*
    _client = IsServer ? _server.AcceptTcpClient() : new TcpClient(IP.ToString(), Port);
    var stream = _client.GetStream();
    return Decompress(stream);
    */

    var lengthByte = new byte[4];
    _stream.Read(lengthByte, 0, 4);
    var length = BitConverter.ToInt32(lengthByte, 0);
    var data = new byte[length];
    _stream.Read(data, 0, length);
    return Decompress(new MemoryStream(data));
}

壓縮和解壓縮 function 只是內置 DeflateStream 的包裝器。

我檢查了錯誤發生時發送的comp.Length和接收的length是否相同。

關於發生了什么的任何想法? 謝謝。 它總是在至少幾幀之后拋出異常,而不是第一幀(至少到目前為止我已經嘗試過)

(當位圖尺寸較大時,即當壓縮算法沒有做太多導致屏幕更復雜時,它似乎發生得更快。雖然不是 100% 肯定)

嘗試執行以下操作:

    int receivedBytesCount = _stream.Read(data, 0, length);

傳遞給 Read 方法的長度變量是最大值。 Read 方法實際上可能讀取的字節數少於長度。 它將返回它實際讀取的字節數。 當您的數據被分割成 TCP 數據包時,就會發生這種情況。 您需要繼續調用 Read 直到收到足夠的字節並將所有內容組合起來以獲得完整的幀。 您需要調整偏移量以避免覆蓋緩沖區。 在您發布的代碼中,它被硬編碼為 0。

暫無
暫無

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

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