Использование StreamSocket для правильного получения данных

Я разрабатываю приложение для Windows Phone 8.1, которое отправляет и получает данные, используя StreamSocket, У меня были проблемы с получением больших данных на телефон. Я написал некоторый код, который, как мне кажется, решает эту проблему, однако я не уверен, достаточно ли этого или я все продумал:

Public Async Function ReceiveResponse() As Task(Of XDocument)

    Dim xResponse As New XDocument
    Dim response As String = String.Empty
    Dim byteCount As UInteger = 1024

    Dim dataReader As New DataReader(_streamSocket.InputStream)

    Try
        With dataReader
            .InputStreamOptions = InputStreamOptions.Partial

            Await .LoadAsync(byteCount)

            Do Until response.EndsWith(vbCrLf)
                response += .ReadString(.UnconsumedBufferLength)
                If Not response.EndsWith(vbCrLf) Then
                    Await .LoadAsync(byteCount)
                End If
            Loop

            xResponse = XDocument.Parse(response.Replace(vbCrLf, ""))
        End With
    Catch ex As Exception
        xResponse = XDocument.Parse("<Response><Error>" & ex.Message & "</Error></Response>")
    Finally
        With dataReader
            .DetachStream()
            .Dispose()
        End With
    End Try

    Return xResponse

End Function

Обратите внимание, что я использую что-то под названием SuperSocket на коммуникационном сервере, который обрабатывает сообщение и отправляет ответ. Чтобы отправить или получить на сервер связи, я должен добавить vbCrLf до конца сообщения. Если я не сделаю этого, сообщение не будет отправлено или получено.

Имея это в виду, вы можете увидеть из кода, который я проверяю vbCrLf при получении потока на телефон:

Await .LoadAsync(byteCount)

Do Until response.EndsWith(vbCrLf)
    response += .ReadString(.UnconsumedBufferLength)
    If Not response.EndsWith(vbCrLf) Then
        Await .LoadAsync(byteCount)
    End If
Loop

В офисе это работает, однако у нас нет помех нашему Wi-Fi. Когда мы настраиваемся на показы в местах, где могут быть сотни других компаний, каждая со своими системами, использующими Wi-Fi, мы, очевидно, замечаем сильные помехи, и это создает впечатление медленного Wi-Fi.

Чтобы обеспечить контекст, это был мой оригинальный код, с которым у меня были проблемы:

Public Async Function ReceiveResponse() As Task(Of XDocument)

    Dim xResponse As New XDocument

    Dim dataReader As New DataReader(_streamSocket.InputStream)

    Try
        With dataReader
            .InputStreamOptions = InputStreamOptions.Partial

            Dim actualStringLength As UInt32 = Await .LoadAsync(9999999)

            If actualStringLength > 0 Then
                xResponse = XDocument.Parse(.ReadString(actualStringLength))
            End If
        End With
    Catch ex As Exception
        xResponse = XDocument.Parse("<Response><Error>" & ex.Message & "</Error></Response>")
    Finally
        With dataReader
            .DetachStream()
            .Dispose()
        End With
    End Try

    Return xResponse

End Function

Обратите внимание на разницу здесь. Я пытался загрузить весь поток с .LoadAsync(9999999) думая, что при увеличении до 9999999 это вернет все. Очевидно, это не тот случай. Я не проверял, что ответ закончен.

Мой вопрос, может ли кто-нибудь увидеть проблему с кодом и проверкой vbCrLf чтобы я получил все сообщения? Есть кто-нибудь лучший способ справиться с этим?

0 ответов

Другие вопросы по тегам