簡體   English   中英

如何將流寫入內存流?

[英]how to write the stream to memory stream?

public void doprocess(TcpClient client)
{    
    MemoryStream ms = new MemoryStream();

    Stream clStream = client.GetStream();

    byte[] buffer_1 = new byte[8192];

    int count = clStream.Read(buffer_1, 0, buffer_1.Length);

    while (count > 0)
    {
        ms.Write(buffer_1, 0, count);

        //the below line doesn't gives response and code hangs here 
        count = clStream.Read(buffer_1, 0, buffer_1.Length);         
    }
}

有沒有其他方法可以將一個流寫入另一個流? 我想兩次使用這個Stream ,這就是我需要將它寫入MemoryStream

在.NET 4中,復制部分非常簡單:

MemoryStream ms = new MemoryStream();
client.GetStream().CopyTo(ms);

如果您不使用.NET 4,那么類似於您已經獲得的代碼基本上是相同的。

請注意,此(以及任何其他嘗試)僅在網絡流已關閉時才起作用 - 否則Read調用將阻止等待更多數據。 我懷疑你的問題是什么 - 這是一個根本問題。

如果你的網絡流沒有關閉,那么你還不清楚你真的希望它如何表現 - 如果“拆分”流的兩個讀者基本上讀取任何緩沖數據,但是然后阻塞直到有新數據? 當然,當從兩個流中讀取緩沖數據時,可以刪除緩沖數據。 如果這就是你所追求的,我認為.NET中沒有任何東西可以幫助你 - 而且它可能非常棘手。

如果你能給我們更多關於你想要做的事情(以及TcpClient連接到什么)的背景,那將真正有所幫助。

您的代碼掛起clStream.Read的原因是因為您要從套接字讀取8192個字節,但另一方面沒有人寫入那么多字節。 所以客戶端就坐在那里等待另一方發送所需的字節數。 根據您嘗試通過TCP實現的協議,服務器必須有一些消息,它打算發送多少數據,以便客戶端事先知道並且只嘗試讀取那么多字節。

例如,在HTTP協議中,服務器在標頭中發送Content-Length標頭,以向客戶端指示將在主體中發送多少數據。

暫無
暫無

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

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