Encoding.ASCII.GetString()问题VB.NET

时间:2011-03-26 08:41:32

标签: .net vb.net sockets encoding network-programming

我从网络流接收数据时从字节转换为字符串时出现问题..输出结果相同但是当我将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到客户端..

是否有任何实例,当字符串转换为字节时,字符串会改变? :

2 个答案:

答案 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