当数据存在时,不要从套接字获取任何数据,并且没有引发异常,连接已打开。使用DataAvailable等待数据

时间:2011-03-24 11:44:06

标签: vb.net sockets tcp tcpclient networkstream

从RFID阅读器读取数据时遇到问题。我通过tcp连接到阅读器并等待DataAvailable为真,然后读取数据,直到我得到数据结束字符。然后我回去等待一个新的DataAvailable。这是在函数的自己的线程中完成的。

似乎有某种超时,如果我在几分钟内没有得到任何数据,那么它只是在do / loop中等待DataAvailable。我把卡拿到RFID阅读器,发出哔哔声,但没有数据可用。我没有任何例外,并且信息表明clientsocket仍然连接。还有什么我可以检查的吗?

如果我以一分钟的间隔将卡片放入阅读器,似乎永远不会发生这种情况。所以闲置2-3分钟:似乎这样做了。

以下是我从套接字读取数据的代码,我已经删除了一些不相关的代码:

Sub test(ByVal ip As String, ByVal port As Integer)
    ' this sub is meant to run forever
    Try
        Dim clientSocket As New System.Net.Sockets.TcpClient()
        clientSocket.Connect(ip, port)
        Using serverStream As NetworkStream = clientSocket.GetStream()
            Do 'loop forever or until error occur

                'Every new dataentry starts here
                Dim inStream(0) As Byte
                Dim returndata As String = ""

                Do 'loop forever 
                    Do Until serverStream.DataAvailable 'loop until data exists to read
                        If clientSocket.Connected = False Then

                            'this will never happen.
                            'but if there are more than 5 minutes between data then
                            'it never got data again as if no data was sent.

                            Exit Sub
                        End If
                        Application.DoEvents()
                    Loop

                    'there is data to read, read first byte and 
                    serverStream.Read(inStream, 0, 1)
                    If inStream(0) = 13 Then

                        'got end of data
                        'exit loop if reading chr 13.
                        returndata &= System.Text.Encoding.ASCII.GetString(inStream)
                        Exit Do

                    End If
                Loop

                GotData(returndata)

            Loop
        End Using
    Catch ex As Exception
        ' handle error
    Finally
        'close connection if open
    End Try
End Sub

1 个答案:

答案 0 :(得分:2)

我发现socket.Connected 仅报告连接上运行最后一个命令的状态。 所以在 Do Until serverStream.DataAvailable 循环中,我使用这个技巧检查连接是否已关闭:

Dim test As Boolean = clientSocket.Client.Poll(10, System.Net.Sockets.SelectMode.SelectRead)
If test = True And serverStream.DataAvailable = False Then
   'restart connection
End If

所以现在终于控制了正在发生的事情,并且知道它因为客户端连接被关闭而我没有任何数据。

那么,我想,既然我知道连接已关闭,我该如何防止它?这更容易,只需每隔10秒将数据发送到tcpip-server,它就会保持打开状态。

对我有用的结果(这不是生产代码,只是解决方案的一个例子):

    Dim s As Date = Now
    Do Until serverStream.DataAvailable
        Dim r As Boolean = clientSocket.Client.Poll(10, System.Net.Sockets.SelectMode.SelectRead)
        If DateDiff(DateInterval.Second, s, Now) > 10 Then
           Dim dta(0) As Byte
           dta(0) = 0
           clientSocket.Client.Send(dta)
           s = Now
        End If
        If r = True And serverStream.DataAvailable = False Then
             'restart sub
             Exit Sub
        End If
   loop

所以现在它甚至没有关闭,需要每x分钟重启一次。

我的问题解决了,我是一个快乐的程序员。 ;)