TcpClient.Connected 返回 true 但客户端未连接,我可以使用什么代替?
题
在 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 但这并不能解决问题。如果客户端未“实际”连接,则可用仅返回 0。
关键是我试图允许连接保持打开状态,并允许我通过同一套接字连接多次接收数据。
解决方案
当 NetworkStream.Read 返回 0 时,表示连接已关闭。 参考:
如果没有数据可供读取,则 NetworkStream.Read 方法将阻塞,直到有数据可用为止。为了避免阻塞,您可以使用 DataAvailable 属性来确定数据是否在传入网络缓冲区中排队等待读取。如果 DataAvailable 返回 true,则读取操作将立即完成。读取操作将读取尽可能多的可用数据,最多可达大小参数指定的字节数。 如果远程主机关闭连接,并且已接收到所有可用数据,则 Read 方法将立即完成并返回零字节。
其他提示
更好的答案:
if (client.Client.Poll(0, SelectMode.SelectRead))
{
byte[] checkConn = new byte[1];
if (client.Client.Receive(checkConn, SocketFlags.Peek) == 0)
{
throw new IOException();
}
}
https://i.stack.imgur.com/Jb0X2.png
链接=https://docs.microsoft.com/en-us/dotnet/api/system.net.sockets.socket.poll?view=netframework-4.0
您需要设置一个计时器,不时向另一个套接字发送消息。
Dim TC 作为新的 TimerCallback(AddressOf Ping)
Tick = New Threading.Timer(TC, Nothing, 0, 30000)
Sub Ping()
Send("Stil here?")
End Sub
可以使用 NetworkStream 的属性来查看是否没有更多可用数据,而不是轮询 client.connected ?
无论如何,有一个 ONDotnet.com 文章包含大量有关听众等的信息。应该可以帮助你解决你的问题......