2011-10-14 28 views
0

我正在努力工作。我成功地將TcpClient對象連接到兩個獨立的遠程機器並向它們傳輸數據。基本上,我試圖連接到端口80上的機器1併發送GET請求。一旦我發送請求,我想保持連接處於活動狀態,以便另一側的軟件可以在準備就緒時發送數據。如何保持連接處於打開狀態並每次在流中提供數據時讀取數據?我試過並嘗試使用NetworkStream.Read和BeginRead無濟於事。我來的最近的是每隔30秒睡一下我的線程,然後做另一個不需要的GET請求。這裏是我從流中讀取的當前代碼。我知道我需要在這裏的某個地方一個循環:如何使用.NET NetworkStream和TcpClient連接到遠程IP並等待數據?

注:RemoteSocket是由這點連我的TcpClient對象

Dim serverStream As NetworkStream = RemoteSocket.GetStream() 
rqst = "GET /Control/Clip_Forwarding_Stream?CameraName=" & URL_Encode(Name) & " HTTP/1.0" & vbCrLf & vbCrLf 
Dim stream As Byte() = Encoding.GetEncoding("Windows-1252").GetBytes(rqst) 
serverStream.Write(stream, 0, stream.Length) 
Dim inStream(1024) As Byte 
Dim recv = serverStream.Read(inStream, 0, inStream.Length) 
Dim data = Encoding.GetEncoding("Windows-1252").GetString(inStream, 0, recv) 

我做的數據是其傳遞給該方法:

注:ForwardSocket是由這點

Dim serverStream As NetworkStream = ForwardSocket.GetStream() 
Dim stream As Byte() = Encoding.GetEncoding("Windows-1252").GetBytes(data) 
serverStream.Write(stream, 0, stream.Length) 

任何例子可以在C#或VB作爲我最熟悉C#連接我其他的TcpClient對象只是不得不寫這所有在VB中。

回答

0

你需要在一個循環內讀取(類似於NoAlias的回答)。但是你不應該循環直到DataAvailable爲false,因爲如果爲了爭論你有4K的數據進來,然後有一個小的暫停(網絡擁塞,不管),然後另一個2K的數據進來你會失去因爲DataAvailable在該暫停中將是錯誤的。

相反,您需要依賴更高級別的協議,在本例中爲HTTP。 HTTP使用一個名爲Content-Length的頭部,它會告訴你到底有多少字節會出現在主體中。您需要進行循環,直到您收到大量內容爲止(或者當然已達到超時值,除非您想永遠等待)。

EDIT1

在再次閱讀您的問題,它看起來像你可獲取一個沒有已知的內容長度的數據。 HTTP支持使用multipart以塊的形式發送數據。這對於手動代碼來說並不好玩,您可能希望查看使用HttpRequest和HttpResponse類來處理這個問題。它仍然會爲您提供一個包含內容的流,但會爲您處理HTTP。

0
Do 

    Dim inStream(1024) As Byte 
    Dim recv = serverStream.Read(inStream, 0, inStream.Length) 
    Dim data = Encoding.GetEncoding("Windows-1252").GetString(inStream, 0, recv) 

Loop While serverStream.DataAvailable 

您也許對BeginRead方法感興趣。

相關問題