2008-09-19 71 views
4

在VB.net中,我使用TcpClient來檢索一串數據。我經常檢查.Connected屬性來驗證客戶端是否已連接,但即使客戶端斷開連接,仍會返回true。我可以使用什麼作爲解決方法?TcpClient.Connected返回true,但客戶端沒有連接,我可以使用什麼?

這是我當前的代碼一個精簡版:

Dim client as TcpClient = Nothing 
client = listener.AcceptTcpClient 
do while client.connected = true 
    dim stream as networkStream = client.GetStream() 
    dim bytes(1024) as byte 
    dim numCharRead as integer = stream.Read(bytes,0,bytes.length) 
    dim strRead as string = System.Text.Encoding.ASCII.GetString(bytes,0,i) 
loop 

我至少想通了GetStream()調用將拋出一個異常,如果客戶端斷開連接,但我已經關閉其他應用程序它仍然不...

謝謝。

編輯 輪詢Client.Available被建議但不能解決問題。如果客戶端不是'acutally'連接可用只返回0.

關鍵是我試圖讓連接保持開放,並允許我通過同一套接字連接多次接收數據。

回答

6

當NetworkStream.Read返回0時,連接已關閉。 Reference

如果沒有數據可供讀取,NetworkStream.Read方法將阻塞,直到數據可用。爲避免阻塞,可以使用DataAvailable屬性來確定數據是否在傳入網絡緩衝區中排隊等待讀取。如果DataAvailable返回true,則Read操作將立即完成。讀取操作將讀取儘可能多的數據,最大數量由size參數指定的字節數。 如果遠程主機關閉連接,並且已收到所有可用數據,則Read方法將立即完成並返回零字節。

0

而不是輪詢client.connected,也許使用NetworkStream的屬性來查看是否沒有更多的數據可用?

無論如何,有一個ONDotnet.com文章與噸的信息聽衆和whatnot。應該幫助你克服你的問題...

1

更好的答案:

if (client.Client.Poll(0, SelectMode.SelectRead)) 
        { 
         byte[] checkConn = new byte[1]; 
         if (client.Client.Receive(checkConn, SocketFlags.Peek) == 0) 
         { 
          throw new IOException(); 
         } 
        } 
+0

這爲我工作,謝謝! – SeeCoolGuy 2016-01-26 22:29:42

相關問題