Это потому, что вы не читаете весь буфер ответа, вы просто берете из него 256 байтов:
data = New [Byte](256) {} ' <-
Также вам нужно освободить ресурс, закрыв потоки и TcpClient , как только вы получите ответ. Всегда создавайте одноразовые объекты с помощью оператора Using , чтобы гарантировать это.
Пример синхронизации
В приведенном ниже примере выполняется подключение к конечной точке в режиме синхронной блокировки, вызывающий поток блокируется до тех пор, пока конечная точка не вернет ответ или не возникнет исключение (например, тайм-аут соединения).
Private Function Connect(server As String, port As Integer, Msg As String) As String
Using client As New TcpClient(server, port),
netStream = client.GetStream,
sr = New StreamReader(netStream, Encoding.UTF8)
Dim msgBytes = Encoding.UTF8.GetBytes(Msg)
netStream.Write(msgBytes, 0, msgBytes.Length)
Return sr.ReadToEnd
End Using
End Function
и вызывающий:
Private Sub TheCaller()
Dim resp As String = Nothing
Try
Dim server = "192.168.8.110"
Dim port = 10001
Dim msg = $"1FFFFFF{ControlChars.CrLf}{ControlChars.CrLf}"
resp = Connect(server, port, msg)
Catch ex As ArgumentNullException
resp = ex.Message
Catch ex As SocketException
resp = ex.SocketErrorCode.ToString
Catch ex As Exception
resp = ex.Message
Finally
If resp IsNot Nothing Then
UpdateStatus(resp)
End If
End Try
End Sub
Асинхронный пример
Возможно, вы захотите использовать асинхронную операцию, поскольку вы разрабатываете приложение WinForms, и я не думаю, что вы хотите блокировать поток пользовательского интерфейса. Здесь вам нужно вызвать Async
методы TcpClient и потоков чтения / записи:
Private Async Function ConnectAsync(server As String,
port As Integer, msg As String) As Task(Of String)
Using client As New TcpClient
Await client.ConnectAsync(server, port)
Using netStream = client.GetStream,
sw = New StreamWriter(netStream, Encoding.UTF8) With {.AutoFlush = True },
sr = New StreamReader(netStream, Encoding.UTF8)
Await sw.WriteLineAsync(msg)
Return Await sr.ReadToEndAsync()
End Using
End Using
End Function
и вызывающего Async
:
Private Async Sub TheCaller()
Dim resp As String = Nothing
Try
Dim server = "192.168.8.110"
Dim port = 10001
Dim msg = $"1FFFFFF{ControlChars.CrLf}{ControlChars.CrLf}"
resp = Await ConnectAsync(server, port, msg)
Catch ex As ArgumentNullException
resp = ex.Message
Catch ex As SocketException
resp = ex.SocketErrorCode.ToString
Catch ex As Exception
resp = ex.Message
Finally
If resp IsNot Nothing Then
UpdateStatus(resp)
End If
End Try
End Sub
UpdateStatus
во фрагментах кода - это просто метод добавления ответов в текстовое поле.
Private Sub UpdateStatus(txt As String)
StatusTextBox.AppendText(txt)
StatusTextBox.AppendText(ControlChars.NewLine)
End Sub