3

Create "Hello World" WebSocket の例を見ていましたが、これを適応させて、コンソールに入力された WebSocket 経由でカスタム メッセージを送信しようとしましたが、コードを理解するのにいくつかの問題があります。

私の質問は、上でリンクした回答に基づいて正しく送信できるように、自分のメッセージをエンコードする正しい方法は何ですか

client.Send(my-own-message);
4

2 に答える 2

1

あなたは本当にソースに行くべきです。Websocket の仕様は実際には非常に読みやすく、メッセージをどのようにフォーマットする必要があるかを正確に示しています。

要するに、接続を確立する最初のハンドシェイクが既に完了していると仮定すると、Websocket フレームに含まれるデータは次のとおりです。

  • 0x81オペコード、メッセージが UTF-8 テキストとしてフォーマットされている場合、およびメッセージがバイナリ データである場合は値を含む 1 バイト0x82(いくつかのブラウザは後者をサポートしていないことに注意してください)
  • メッセージの長さを表す、1 バイト以上の長さフィールド。最初のバイトの最上位ビットは、クライアントから送信されたメッセージに設定する必要があります (これは、ペイロードがマスクされていることを示します。これは、クライアントからサーバーへのメッセージで実行する必要があり、サーバーからクライアントへのメッセージでは実行してはなりませ) )。長さフィールドは可変長にすることができます。長さが 126 バイト未満の場合は、単純に 1 バイトとしてエンコードされます (前述のように、最上位ビットはマスキングを示すために予約されています)。長さが 65KB 未満の場合、最初のバイトの使用可能な 7 ビットは値 126 を取り、後続の 2 バイトには長さが 16 ビット整数として含まれます。それ以外の場合、最初のバイトの 7 ビットは値 127 を取り、後続の 8 バイトには長さが 64 ビット整数として含まれます。
  • メッセージごとにランダムに選択する必要がある 4 バイトのマスキング キー
  • 最後に、送信したい実際のメッセージです。これは、各バイトをマスキング キーのバイトで XOR するだけで、マスキング キーを使用してマスクする必要があります。(メッセージのバイトは、マスキング キーiの th バイトと一緒に XOR する必要があります)。i%4

これを行うと、UTF8 テキストまたは未加工のバイナリ データを含む有効な Websocket フレームが作成されます。ご覧のとおり、いくつかの手順が必要ですが、それぞれは比較的簡単です。(繰り返しになりますが、リンク先の RFC を確認してください。これはすべて記憶から書いたものであり、多少の不正確さがある可能性があります)

于 2012-11-24T12:53:58.327 に答える
1

したがって、まずConsole.Read()1 つの文字のみを読み取り、この文字を表す int を返します。

メッセージを送信したい場合は、おそらくConsole.ReadLine()文字列を返すものを使用したいと思うでしょう。

string msg = Console.ReadLine();
client.Send(GetBytes(msg));

static byte[] GetBytes(string str)
{
    byte[] bytes = new byte[str.Length * sizeof(char)];
    System.Buffer.BlockCopy(str.ToCharArray(), 0, bytes, 0, bytes.Length);
    return bytes;
}

メートル単位の場合:

byte[] ascii = System.Text.Encoding.ASCII.GetBytes (msg);
byte[] utf8 = System.Text.Encoding.UTF8.GetBytes (msg);
于 2012-11-24T12:05:51.847 に答える