字节初始化循环读取套接字

时间:2013-08-08 09:01:31

标签: vb.net

我是newbi并尝试编写一个客户端代码,它从服务器接收数据并输出到文本框。 问题是当循环中的第二个 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

我在网站周围徘徊,但仍然不明白我做错了什么......

1 个答案:

答案 0 :(得分:0)

第一次致电Read

ServerStream.Read(inStream, 0, 5)

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

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

  • 为邮件添加长度前缀,或
  • 使用不能在消息中显示的字节值作为消息结束标记,或
  • 仅发送固定长度的消息,或
  • 在消息开头包含消息“type”代码,其中每个消息类型如果是固定长度