2008-09-19 161 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

相关问题