-1

TCP クライアントを使用してログイン機能を作ろうとしています。クライアント側とサーバー側の 2 つの形式があります。

クライアント側はユーザー入力を処理し、サーバー側はデータベースに接続します。

問題はリーダーの結果で、常に次のように両方の入力を 1 つの長い文字列に結合します。

   myusernamemypassword

クライアント側の送信者の一部は次のとおりです。

    byte[] byteUsername = Encoding.Unicode.GetBytes(username);
    byte[] bytePassword = Encoding.Unicode.GetBytes(password);

    NetworkStream stream = client.GetStream();

    stream.Write(username, 0, byteUsername.Length);
    stream.Write(password, 0, bytePassword.Length); 
        //if offset != 0, the code always return ArgumentOutOfRangeException

サーバー側のリーダー:

    return Encoding.Unicode.GetString(buffer, 0, buffer.Length)

長い検索の後、解決策を見つけましたが、2つの文字列しか処理できません。3 番目の + 文字列は 2 番目の文字列と結合されます。他の機能のために少なくとも 4 つの文字列を送信する必要があります。

更新されたリーダーコードは次のとおりです。

List<string> list = new List<string>();
int totalRead = 0;
do
{
    int read = client.GetStream().Read(buffer, totalRead, buffer.Length - totalRead);

    totalRead += read;

    list.Add(Encoding.Unicode.GetString(buffer, 0, totalRead));

} while (client.GetStream().DataAvailable);

このコードがよくわかりません。どのバイトが最初の文字列の一部であるかをどのように知ることができますか? sizeofRead()パラメータはlength-totalReadwhich isです。length - 0バッファ全体を返す必要がありますか?

解決策はありますか?

前にありがとう

4

1 に答える 1

3

各文字列の前に、その長さ (文字数ではなくバイト数) を 4 バイト整数としてプレフィックスする必要があります。
このようにして、サーバーは各文字列に読み込むバイト数を認識します。

于 2012-08-16T14:58:28.263 に答える