#vb.net #utf-8 #tcp
#vb.net #utf-8 #tcp
Вопрос:
У меня проблема с созданием двух приложений для отправки текстовых данных между собой. Сообщение передается без каких-либо проблем, ответ тоже получен. Но в конце строки, отправленной / полученной с каждой стороны, много символов «Новой строки». Я предполагаю, что это из-за того, что я читаю полный буфер; Я пытался удалить все Chr (10) и Chr (13); Я также пытался обрезать строку, но это не сработало.
Вот код, который я использую :
На стороне клиента :
Dim cl As New TcpClient
cl.Connect("127.0.0.1", 2000)
Dim str As NetworkStream = cl.GetStream
Dim HelloInBytes As Byte() = Encoding.UTF8.GetBytes("Hello")
str.Write(HelloInBytes, 0, HelloInBytes.Length)
Dim Buffer(cl.ReceiveBufferSize) As Byte
str.Read(Buffer, 0, cl.ReceiveBufferSize)
Console.WriteLine(Encoding.UTF8.GetChars(Buffer))
На стороне сервера :
Dim srv As New TcpListener(IPAddress.Any, 2000)
srv.Start()
Dim cl As TcpClient = srv.AcceptTcpClient
Dim str As NetworkStream = cl.GetStream
Dim buf(cl.ReceiveBufferSize) As Byte
str.Read(buf, 0, cl.ReceiveBufferSize)
Dim res As Byte() = Encoding.UTF8.GetBytes("World")
str.Write(res, 0, res.Length)
Есть ли способ «очистить» полученную строку?
Спасибо за помощь.
РЕДАКТИРОВАТЬ: Решение: оно работает с решением Harzcle. Я нашел другое решение, которое заключается в использовании этой функции для полученной строки :
Public Function CleanString(ByRef Str As String)
Return Str.Replace(Encoding.UTF8.GetChars({0, 0, 0, 0}), Nothing)
End Function
UTF8 работает с 4 байтами, и когда я читаю поток и помещаю его в буфер, если нет символа, 4 байта остаются равными 0.
Ответ №1:
Используйте Flush() после записи в буфер
str.Write(HelloInBytes, 0, HelloInBytes.Length)
str.Flush()
И
str.Write(res, 0, res.Length)
str.Flush()
Редактировать:
Вы можете использовать разделитель или что-то в этом роде.
На стороне клиента:
Dim delimiterChar as Char = "|"
Dim out As Byte() = System.Text.Encoding.UTF8.GetBytes(txtOut.Text delimiterChar)
server.Write(outStream, 0, outStream.Length)
server.Flush()
И на стороне сервера:
Dim delimiterChar as Char = "|"
Dim Stream As NetworkStream = clientSocket.GetStream()
Stream.Read(bytesFrom, 0, CInt(client.ReceiveBufferSize))
Dim data As String = System.Text.Encoding.UTF8.GetString(bytesFrom)
data = data.Substring(0, data.IndexOf(delimiterChar)) 'From 0 to delimiter
Комментарии:
1. Спасибо за подсказку, но она не сработала. Я добавил его с обеих сторон; но много «новой строки» все еще остается. Есть идеи?
Ответ №2:
Это приведет к удалению всех нулевых символов в конце полученной строки
client_content = client_content.Replace(Chr(0), Nothing)
Для удаления новых строк:
client_content = client_content.Replace(vbLf, Nothing)