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