Проблема в том, что вы зацикливаетесь, пока networkStream.DataAvailable
не станет верным.В работающем приложении ваш цикл может выполняться так быстро, что отправитель не успеет снова заполнить буфер.
Вы должны либо выполнить цикл, пока не будет выполнено определенное условие.Примеры:
1) Все ожидаемые данные были получены
2) Получен определенный набор данных (т. Е. EOF)
3) Определенныйсрок был достигнут (т.е. если вы не получили никаких данных в течение 30 секунд, залог).Если вы находитесь в бесконечном цикле, вы всегда должны реализовывать что-то подобное, если только вы не намерены продолжать процесс вечно.
Я бы изменил обработку на что-то вроде:
Dim fLoopDone As Boolean
' Initialize the timestamp for the last data that was read so that we wait up to 30 seconds
' at the start for data.
Dim dtLastData As DateTime = Date.Now
Do
' Only process the data if there is some available.
If networkStream.DataAvailable Then
numberOfBytesRead = networkStream.Read(myReadBuffer, 0, myReadBuffer.Length)
myCompleteMessage.AppendFormat("{0}", Encoding.ASCII.GetString(myReadBuffer, 0, numberOfBytesRead))
intLenMyReadBuf = myReadBuffer.Length
intLenComplMsg = myCompleteMessage.Length
swWriter.WriteLine("buf len = " & intLenMyReadBuf & ", msg len = " & intLenComplMsg)
' Record the last time that we received data
dtLastData = Date.Now
' Possibly add a check in here to see if you are done reading.
Else
' If more than 30 seconds has elapsed since the last data arrived, break out of the loop
If Date.Now.Subtract(dtLastData).TotalSeconds > 30 Then
fLoopDone = True
End If
End If
Loop While Not fLoopDone