【问题标题】:Checking client closed in tcp connection检查在 tcp 连接中关闭的客户端
【发布时间】:2016-09-15 15:35:31
【问题描述】:

我对使用套接字和 TCP 非常陌生,而且我试图确定我的客户端和服务器之间的连接是否已关闭。

我当前的方法是在我结束连接时将字节数组的第一个元素(b(10) 仅用于写入和读取流)更改为 0x0 服务器端,然后检查第一个字节是否数组为0x0 服务端查看客户端是否关闭。

我对此非常不满意,理想情况下希望能够检查它的连接,但我找不到任何方法。

现在这只是用来从客户端发送几个字符的字符串并在服务器窗口上打印出来,但理想情况下,当我了解更多我在做什么时,我想从这里开始。

服务器:

While True
    client.GetStream.Read(b, 0, 10)
    If b(0) <> Convert.ToByte(0) Then
        For i = 0 To 10
            Console.Write(Convert.ToChar(b(i)))
        Next i
        Console.Write(vbCrLf)
    Else
        Exit While
    End If
End While

客户:

If aString = "y" Then
    'Create a TcpClient.
    client = New TcpClient(localAddr.ToString, port)
    Do
        Array.Clear(b, 0, 10)
        b(0) = 1
        Console.Write("Ready to quit? (y/message)")
        aString = Console.ReadLine()
        If aString <> "y" Then
            For i = 0 To Len(aString.ToCharArray()) - 1
                Console.WriteLine(i)
                b(i) = Convert.ToByte(aString.ToCharArray.GetValue(i))
            Next i
            client.GetStream.Write(b, 0, 10)
        End If
    Loop Until aString = "y"
    b(0) = Convert.ToByte(0)
    client.GetStream.Write(b, 0, 10)
    client.GetStream.Close()
    client.Close()
End If

谁能提供有关如何以不那么混乱的方式执行此操作的详细信息,或者向我指出一些可以提供帮助的资源?

【问题讨论】:

  • TcpClient.Connected 将返回 True/False 如果您的连接已使用 TcpClient.Close() 关闭(并且在关闭期间没有发生互联网问题)。当您更喜欢 TCP 时,我还建议您阅读 this answer。它提供了一种可靠的消息处理方式。
  • 我尝试了 TcpClient.Connected 但我认为如果连接建立则返回 true,如果它关闭也没关系,结果我需要尝试将数据发送到客户端,因为它只是更新每个 io 操作。

标签: vb.net tcp server client


【解决方案1】:

查看How to check the connection state of a TCP Server (Socket) with TCP Client in VB.NET的答案我添加了以下函数:

Public Function IsConnected(ByRef client As TcpClient) As Boolean
    Try
        Return Not (client.Client.Poll(-1, SelectMode.SelectRead) _
                 AndAlso client.Available = 0)
    Catch ex As Exception
        Return False
    End Try
End Function

将服务器调整为:

While True
    If IsConnected(client) Then
        client.GetStream.Read(b, 0, 10)
        For i = 0 To 10
            Console.Write(Convert.ToChar(b(i)))
        Next i
        Console.Write(vbCrLf)
    Else
        Exit While
    End If
End While

而客户:

If aString = "y" Then
    'Create a TcpClient.
    client = New TcpClient(localAddr.ToString, port)
    Do
        Array.Clear(b, 0, 10)
        Console.Write("Ready to quit? (y/message)")
        aString = Console.ReadLine()
        If aString <> "y" Then
            For i = 0 To Len(aString.ToCharArray()) - 1
                Console.WriteLine(i)
                b(i) = Convert.ToByte(aString.ToCharArray.GetValue(i))
            Next i
            client.GetStream.Write(b, 0, 10)
        End If
    Loop Until aString = "y"
    client.GetStream.Close()
    client.Close()
End If

现在一切正常。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-01-24
    • 1970-01-01
    • 1970-01-01
    • 2014-07-03
    • 2010-11-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多