我一直在开发一个 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
以确保我已收到所有消息吗?有没有人有更好的方法来处理这个?