使用StreamSocket正确接收数据

时间:2016-10-10 10:24:11

标签: .net vb.net sockets windows-phone-8.1 supersocket.net

我一直在开发一个使用StreamSocket发送和接收数据的Windows Phone 8.1应用。我在手机上接收大数据时遇到了问题。我已经编写了一些我认为处理过的代码但是我不确定它是否足够或者我是否已经考虑过所有内容:

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以确保我已收到所有邮件?有没有人有更好的方法来处理这个?

0 个答案:

没有答案