0

私は初心者で、サーバーからデータを受信して​​テキストボックスに出力するクライアントコードを作成しようとしています。問題は、ループ内の 2 番目の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 バイトしか読み取っていない可能性があります。2 回目の使用法 (ループでの読み取り) の方がわずかに優れていますがEND、接続の反対側から送信された「メッセージ」全体 (例: ) を受信すると想定しているようです。

そのような保証はありません。完全な「メッセージ」を受信したことを(何らかの方法で)検出するまで、ループする必要があります(そして、バッファ内のどこから新しく受信したデータの書き込みを開始するかを追跡します)。これは通常、次の方法で行われます。

  • メッセージに長さのプレフィックスを付ける、または
  • メッセージ内に表示できないバイト値をメッセージ終了マーカーとして使用する、または
  • 固定長のメッセージのみを送信する、または
  • メッセージの先頭にメッセージ「タイプ」コードを含めます。各メッセージタイプは固定長の場合
于 2013-08-08T09:14:58.703 に答える