0

我是新手,正在尝试编写一个客户端代码,该代码从服务器接收数据并输出到文本框。问题是当循环中的第二个ServerStream.Read(inStream, 0, inStream.Length)初始化inStream值时。

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        ServerStream.Read(inStream, 0, 5)
        ReceivedData = Encoding.ASCII.GetString(inStream)
        ServerStream.Flush()

        If (String.Compare(ReceivedData, "_OK_") = 0) Then
            msg(ReceivedData)
            Do
                Dim recv = ServerStream.Read(inStream, 0, inStream.Length)
                ReceivedData = Encoding.GetEncoding("Windows-1252").GetString(inStream, 0, recv)
                msg(ReceivedData)
                If (String.Compare(ReceivedData, "END") = 0) Then
                    msg("Server closed")
                End If
            Loop While ServerStream.DataAvailable
        Else
            msg("Unable to recieve msg")
        End If

End Sub

我正在浏览网站,但仍然不明白我做错了什么......

4

1 回答 1

0

在您第一次致电Read

ServerStream.Read(inStream, 0, 5)

你忽略它的返回值。它可能只读取了 1 个字节。您的第二次使用(循环读取)稍好一些,但您似乎再次假设您将收到END从连接另一端发送的整个“消息”(例如)。

没有这样的保证。您需要循环(并跟踪缓冲区中的何处开始写入新接收的数据),直到您(以某种方式)检测到您已收到完整的“消息”。这通常通过以下方式完成:

  • 在消息前面加上它的长度,或者
  • 通过使用不能出现在消息中的字节值作为消息结束标记,或
  • 仅发送固定长度的消息,或
  • 在消息的开头包括一个消息“类型”代码,其中每个消息类型如果是固定长度
于 2013-08-08T09:14:58.703 回答