从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
答案 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分钟重启一次。
我的问题解决了,我是一个快乐的程序员。 ;)