簡體   English   中英

從NetworkStream讀取數據

[英]Reading data from NetworkStream

我嘗試在NetworkStream上發送大量數據(圖像),但看起來單次Read是不夠的-我想嘗試讀取NetworkStream上發送的所有數據,但我不知道如何去做。 另外,我想將此數據作為字節數組byte[] 任何想法如何做到這一點?

byte[] b = new byte[length];
int bytes = 0;
while (!GetNetworkStream().DataAvailable)
    Thread.Sleep(20); // Some delay
bytes = GetNetworkStream().Read(b, 0, b.Length);
MemoryStream ms = new MemoryStream();
ms.Write(b, 0, bytes);

我也嘗試了下一個似乎無效的代碼:

using (NetworkStream stream = CommunicationHandler.GetStream())
{
    byte[] data = new byte[1024];
    using (MemoryStream ms = new MemoryStream())
    {
        int numBytesRead;
        while ((numBytesRead = stream.Read(data, 0, data.Length)) > 0)
        ms.Write(data, 0, numBytesRead);
    }
}

如我所見,您在這里放入了一些自己創建的方法,我認為您在讀取數據時沒有任何問題。 您真正需要的是在新文件啟動時進行某種處理,因為您的套接字應該連續接收數據。

顯然,這取決於要使用的圖像格式以及要發送的圖像格式。 對於PNG文件,您應該閱讀此pdf文件的第12章。 特別是第12節。如果您按以下順序操作,則可以尋找簽名並從緩沖區中提取數據

(decimal)             137 80 78 71 13 10 26   10
(hexadecimal)          89 50 4e 47 0d 0a 1a   0a
(ASCII C notation)   \211 P  N   G \r \n \032 \n

然后,您只需簡單地重新創建png文件。 您必須對發送的每種文件類型執行相同的操作。

如果您不關心文件的內容,則可以創建一些數據幀並將數據放入有效負載中(壓縮和加密)。 創建自己的簽名等等。 最簡單的示例是Modbus。 您可以在此處了解更多信息。

編輯

讀取tcp流的數據非常簡單。 只看這段代碼。

var receiveBufferSize = 512; // amount of bytes to read
try
{
    var buffer = new byte[receiveBufferSize];
    _tcpClient.GetStream().Read(buffer, 0, receiveBufferSize);
    // handle the received data chunk
}
catch (Exception e)
{
    // handle the error
    Debug.WriteLine(ex.Message);
}

暫無
暫無

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

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