TcpClient.Connected 返回 true 但客户端未连接,我可以使用什么代替?

StackOverflow https://stackoverflow.com/questions/101708

  •  01-07-2019
  •  | 
  •  

在 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 文章包含大量有关听众等的信息。应该可以帮助你解决你的问题......

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top