5

在 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。

关键是我试图让连接保持打开状态并允许我通过同一个套接字连接多次接收数据。

4

4 回答 4

6

当 NetworkStream.Read 返回 0 时,连接已关闭。参考

如果没有数据可供读取,NetworkStream.Read 方法将阻塞,直到数据可用。为避免阻塞,您可以使用 DataAvailable 属性来确定数据是否在传入网络缓冲区中排队等待读取。如果 DataAvailable 返回 true,则读取操作将立即完成。Read 操作将读取尽可能多的数据,最多为 size 参数指定的字节数。如果远程主机关闭连接,并且已接收到所有可用数据,则 Read 方法将立即完成并返回零字节。

于 2008-09-19T15:04:15.163 回答
1

更好的答案:

if (client.Client.Poll(0, SelectMode.SelectRead))
{
    byte[] checkConn = new byte[1];

    if (client.Client.Receive(checkConn, SocketFlags.Peek) == 0)
        throw new IOException();
}
于 2010-09-23T22:41:28.497 回答
-2

而不是轮询 client.connected,也许使用 NetworkStream 的属性来查看是否没有更多可用数据?

无论如何,有一篇ONDotnet.com文章,其中包含有关听众的大量信息等等。应该可以帮助您解决问题...

于 2008-09-19T13:22:02.727 回答
-2

https://i.stack.imgur.com/Jb0X2.png

链接= https://docs.microsoft.com/en-us/dotnet/api/system.net.sockets.socket.poll?view=netframework-4.0

您需要设置一个计时器,不时向另一个套接字发送消息。

将 TC 调暗为新的 TimerCallback(AddressOf Ping)

Tick = New Threading.Timer(TC, Nothing, 0, 30000)

Sub Ping()
    Send("Stil here?")
End Sub
于 2019-02-02T21:22:59.933 回答