我从网络流接收数据时从字节转换为字符串时出现问题..输出结果相同但是当我将Encoding.ASCII.GetString()生成的字符串与实际字符串进行比较时,输出不一样..
这是我的代码..
服务器:
Dim tcp As New TcpClient
tcp = findTCP(ip)
Dim ns As NetworkStream = tcp.GetStream
Dim b As [Byte]() = Encoding.ASCII.GetBytes("a")
ns.Write(b, 0, b.Length)
Dim bb(tcp.ReceiveBufferSize) As Byte
ns.Read(bb, 0, tcp.ReceiveBufferSize)
If Encoding.ASCII.GetString(bb) = "b" Then
a = "conn"
Else
a = "not"
End If
客户端:
Dim ns As NetworkStream = socClient.GetStream
Dim b(socClient.ReceiveBufferSize) As Byte
ns.Read(b, 0, socClient.ReceiveBufferSize)
Dim bb As [Byte]() = Encoding.ASCII.GetBytes("b")
ns.Write(bb, 0, bb.Length)
仅用于ping目的.. :))
我的服务器ping到客户端..
是否有任何实例,当字符串转换为字节时,字符串会改变? :
答案 0 :(得分:2)
您忽略了Read
方法的返回值,它会告诉您实际读取的字节数。之后缓冲区中的所有内容都是垃圾。此外,它会告诉您是否已读取所有流,因此您不知道是否已读取所有数据或有多少数据。
使用Read
方法的返回值来确定您获得的内容,以及是否需要再次调用它。假设一个1000字节的数组足以容纳流,这应该可以工作:
Dim bb(999) As Byte
Dim pos As Integer = 0
Dim len As Integer
Do
len = ns.Read(bb, pos, bb.Length - pos)
pos += len
Loop While len > 0
解码数据时还需要使用该长度,否则您将解码整个缓冲区,包括实际数据后的垃圾:
Encoding.ASCII.GetString(bb, 0, len)
答案 1 :(得分:1)
您的字节数组声明太大了。这会导致字符串有额外的附加字符,这会使字符串比较逻辑混乱。
ReceivedBufferSize是套接字内部的缓冲区大小,通常具有2.000-8000字节的值。您应该使用Available属性来指示当前接收的字节数。
Dim bb(tcp.Available) As Byte