0

我一直在开发一个 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。当我们在可能有 100 家其他公司各自拥有自己的使用 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以确保我已收到所有消息吗?有没有人有更好的方法来处理这个?

4

0 回答 0