Следующее является кодом, который я использую для чтения данных по сокету.NET. Эта часть кода выполняется единственным отдельным потоком. Это работает хорошо в первый раз, когда на втором повторении это останавливается в "клиенте. Получите (буферизуют)", и никогда не восстанавливается с него. Первоначально я использовал рекурсию для чтения данных, но изменил его на повторение, думая, что рекурсия могла быть источником проблемы. Но по-видимому это не.
Private Sub ReceiveSocket(ByVal client As Socket)
Dim bytesRead As Integer = 0
Do
bytesRead = client.Receive(buffer)
sb.Append(Encoding.ASCII.GetString(buffer, 0, bytesRead))
Array.Clear(buffer, 0, buffer.Length)
Loop While bytesRead > 0
End Sub 'ReceiveCallback
Почему это зависает в Receive
?
Ну, это нормально. Метод Receive() не вернется, пока сервер не отправит что-то еще. Что он, вероятно, не сделает в вашем случае, пока вы не попросите его сначала отправить что-то еще. Повторно вызывать Receive() следует только в том случае, если вы не получили полный ответ сервера.
Проверьте спецификацию протокола. Обычно сервер посылает что-то, что позволяет вам определить, что полный ответ был получен. Например, количество байт в сообщении. Или специальный символ в конце сообщения. Популярным является символ Linefeed (vbLf).