在VB.net中,我使用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。
关键是我正在尝试允许连接保持打开并允许我通过同一套接字连接多次接收数据。
答案 0 :(得分:6)
当NetworkStream.Read返回0时,表示连接已关闭。 Reference:
如果没有可用于读取的数据,则NetworkStream.Read方法将阻塞,直到数据可用。为避免阻塞,您可以使用DataAvailable属性来确定数据是否在传入网络缓冲区中排队等待读取。如果DataAvailable返回true,则Read操作将立即完成。 Read操作将读取尽可能多的数据,最多可达size参数指定的字节数。 如果远程主机关闭连接,并且已收到所有可用数据,则Read方法将立即完成并返回零字节。
答案 1 :(得分:1)
更好的回答:
if (client.Client.Poll(0, SelectMode.SelectRead))
{
byte[] checkConn = new byte[1];
if (client.Client.Receive(checkConn, SocketFlags.Peek) == 0)
{
throw new IOException();
}
}
答案 2 :(得分:0)
https://i.stack.imgur.com/Jb0X2.png
LINK = https://docs.microsoft.com/en-us/dotnet/api/system.net.sockets.socket.poll?view=netframework-4.0
您需要设置一个发送MSG上和另一个插座从时间到时间的计时器。
昏暗TC作为新TimerCallback(AddressOf平)
Tick = New Threading.Timer(TC,Nothing,0,30000)
Sub Ping()
Send("Stil here?")
End Sub
答案 3 :(得分:-1)
不是轮询client.connected,而是使用NetworkStream的属性来查看是否没有更多可用数据?
无论如何,有一篇ONDotnet.com篇文章,里面有关于听众和其他什么的信息。应该可以帮助您解决问题......