2011-09-23 66 views
3
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如何將流寫入內存流?

回答

5

在.NET 4中複製的部分是很容易的:

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

如果你不使用.NET 4,那麼類似的代碼,你已經得到了基本相同的事情。

然而,請注意,如果網絡流已經關閉,這(和任何其他的企圖)只會工作 - 否則Read調用將阻塞等待更多的數據。我懷疑這是你的問題 - 這是一個基本問題。

如果您的網絡流沒有關閉,那麼目前還不清楚您希望它的行爲方式 - 「split」流的兩個閱讀器是否應該基本讀取任何緩衝數據,但是會阻塞,直到出現新數據?當然,從兩個流中讀取緩衝的數據都可以被刪除。如果這就是你所追求的,我認爲.NET中沒有任何東西可以幫助你 - 特別是它可能非常棘手。

如果你可以給我們更多關於你正在嘗試做什麼(以及TcpClient連接到什麼)的上下文,那真的會有所幫助。

+0

@purvang:啊,所以你是服務器,而不是客戶...客戶端要做什麼?如果它沒有關閉連接,你可以永遠閱讀... –

+0

TcpClient client = tcplistener.AcceptTcpClient(); //它接受客戶端請求 – purvang

+0

客戶端只是在瀏覽器中提供請求,我只是掃描請求是否正確,然後將其發送到原始服務器。所以我使用這個流來掃描請求,所以我需要使用兩個流,一個用於顯示,另一個用於掃描。我讀了兩次使用這個流,我應該把它寫入內存流。請指導我!感謝你的回答!! – purvang

1

您的代碼掛在clStream.Read上的原因是因爲您正在從套接字讀取8192個字節,但在另一側沒有人正在寫入那麼多字節。所以客戶端只是坐在那裏等待對方發送所需的字節數。根據您試圖通過TCP實現的協議,服務器必須發出多少數據才能發送,以便客戶端事先知道並只嘗試讀取那麼多字節。

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