Использование 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
чтобы я получил все сообщения? Есть кто-нибудь лучший способ справиться с этим?