Текстовая связь между приложениями с TCP-сокетами в VB.Net

#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)