如何获取接收包的长度呢
Do While _netStream.Read(_bytes, 0, _bytes.Length)
...........
Loop
如果我用一个循环来读取数据包,那我应该如何判断我接收的包是多大的呢,
在一个其它的问题中我看到有人这样写
int _length = _netStream.Read(_bytes, 0, _bytes.Length)
但是_bytes的大小和_bytes.Length的大小不都是已经固定了吗?而且这个也没法写在循环中,敬请解答
谢谢
[解决办法]
先放到缓存里,收完以后在确定
[解决办法]
我现在用的一个异步streamread类方法,参考一下吧
注明:SB为streambuilder
SHex是我写的一个函数 功能是把接受的byte数组变成对应的string.因为我传送的数据是byte型的,里面有0x00或者其他非ASCII码,所以这么处理.如果传送的只是ascii字符,那么可以直接用getstring转成字符串.
Private Sub StreamReadCallback(ByVal ar As IAsyncResult)
Dim s As NetworkStream = DirectCast(ar.AsyncState, NetworkStream)
Dim RevStr As String
If IsClose = False Then
Try
Dim length As Integer = s.EndRead(ar)
If length > 0 Then
SB.Append(SHex(Buffers, 0, length))
Threading.Thread.Sleep(50)
If s.DataAvailable Then
debugInfo(0) = Now.ToString
debugInfo(1) = "StreamReadCallback方法读取 "
debugInfo(2) = "未完 " & SHex(Buffers, 0, length)
AddDebug(1, debugInfo)
s.BeginRead(Buffers, 0, 1024, New AsyncCallback(AddressOf StreamReadCallback), s)
Exit Sub
Else
RevStr = SB.ToString
debugInfo(0) = Now.ToString
debugInfo(1) = "StreamReadCallback方法读取 "
debugInfo(2) = "全部 " & RevStr
AddDebug(1, debugInfo)
q.Enqueue(RevStr)
End If
End If
Catch oe As ObjectDisposedException
debugInfo(0) = Now.ToString
debugInfo(1) = "StreamReadCallback方法异常 "
debugInfo(2) = oe.Message
AddDebug(0, debugInfo)
Catch ex As Exception
MsgBox(ex.Message)
debugInfo(0) = Now.ToString
debugInfo(1) = "StreamReadCallback方法异常 "
debugInfo(2) = ex.Message
AddDebug(0, debugInfo)
Finally
If IsClose = False Then
SB = New StringBuilder
s.BeginRead(Buffers, 0, 1024, New AsyncCallback(AddressOf StreamReadCallback), s)
End If
End Try
End If
End Sub
同步方式也一样,在循环里做这个就行.记得稍微停顿几十毫秒,不然可能网络传输还没过来,造成丢失数据.