首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >不要从套接字获取任何数据,因为数据应该在套接字中,并且没有引发异常,连接是打开的。使用DataAvailable等待数据

不要从套接字获取任何数据,因为数据应该在套接字中,并且没有引发异常,连接是打开的。使用DataAvailable等待数据
EN

Stack Overflow用户
提问于 2011-03-24 19:44:06
回答 1查看 3K关注 0票数 2

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

似乎有某种超时,如果我在几分钟内没有得到任何数据,那么它只是停留在do/循环中等待DataAvailable。我把卡拿到RFID读卡器上,它发出嘟嘟声,但没有可用的数据。我没有得到任何异常,并且信息显示clientsocket仍处于连接状态。还有什么我可以检查的吗?

如果我马上把卡放到读卡器上-间隔时间,这似乎永远不会发生。因此2-3分钟的空闲时间:ing似乎就是这样做的。

下面是我从套接字读取数据的代码,我去掉了一些不相关的代码:

代码语言:javascript
复制
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
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-03-24 22:17:08

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

代码语言:javascript
复制
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发送一次数据,它就会将其保持打开。

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

代码语言:javascript
复制
    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分钟重新启动一次。

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5418582

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档