我在从RFID读取器读取数据时遇到问题。我通过tcp连接到阅读器,等待DataAvailable为真,然后读取数据,直到得到数据字符的结尾。然后我就回去等待一个新的DataAvailable。这是在函数自己的线程中完成的。
似乎有某种超时,如果我在几分钟内没有得到任何数据,那么它只是停留在do/循环中等待DataAvailable。我把卡拿到RFID读卡器上,它发出嘟嘟声,但没有可用的数据。我没有得到任何异常,并且信息显示clientsocket仍处于连接状态。还有什么我可以检查的吗?
如果我马上把卡放到读卡器上-间隔时间,这似乎永远不会发生。因此2-3分钟的空闲时间:ing似乎就是这样做的。
下面是我从套接字读取数据的代码,我去掉了一些不相关的代码:
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发布于 2011-03-24 22:17:08
我发现socket.Connected 只报告在connection上运行最后一个命令时的状态。因此,在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分钟重新启动一次。
我的问题解决了,我是一个快乐的程序员。;)
https://stackoverflow.com/questions/5418582
复制相似问题