[英]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.