Encoding.ASCII.GetString () Проблема VB.NET - PullRequest
0 голосов
/ 26 марта 2011

У меня возникла проблема при получении данных из сетевого потока, которые были преобразованы из байтов в строку. Вывод был бы таким же, но когда я сравниваю строку, сгенерированную из 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)

только для целей пинга ..:)

мой сервер проверяет связь с клиентом ..

Есть ли какой-нибудь случай, когда строка будет преобразована в байты, строка изменится? :

Ответы [ 2 ]

2 голосов
/ 26 марта 2011

Вы игнорируете возвращаемое значение метода 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 голос
/ 26 марта 2011

Ваши байтовые массивы объявлены слишком большими. Это приводит к тому, что в строках добавляются дополнительные символы, которые мешают вашей логике сравнения строк.

ReceivedBufferSize - это размер буфера внутри сокета, который обычно имеет значение в диапазоне от 2000 до 8000 байт. Вместо этого следует использовать свойство Available, которое указывает, сколько байтов получено в настоящее время.

Dim bb(tcp.Available) As Byte
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...