2012-01-15 18 views
2

私自身のWebSocket Serverを作成しようとしています。JavaでWebSocketからメッセージをデコードする

マイJavaScriptクライアントがonOpenと現在反応するので、私は握手が有効であると だと思う:)私はいくつかのフレームワークが、このためにそこにあることを知っているが、私は勉強したいと思いますので、私は自分自身でそれを行います接続が確立されます。

今問題:

私のJavaサーバはチャンネルで読み取るためのセレクター・スレッドを使用しています。

クライアントのWebSocketオブジェクトで*.send("test message")を実行した場合、サーバーはバイト配列をデコードできません。

私は使用されているエンコード/デコード技術についての情報がないため、デコードするために多くのバージョンを試しました。

例えば:

new String(Base64.decodeBase64(buffer.array())) 

または

Charset set = Charset.forName("UTF-8"); 
new String(Base64.decodeBase64(set.decode(buffer).toString())) 

メッセージが完全にByteBufferのチャンネルから読み込まれるので、私は、これは問題ではないと思います。

誰でも手伝ってもらえますか?


大丈夫この投稿はクライアントにデータを送信するのに役立ちます。これは、作品罰金:)
しかし、私は私は、サーバーが7バイトを受信

socket.send("x"); 

一つだけの手紙送るクライアントでクライアント:(

から受信したデータをデコードする方法を理解していませんか? ??

ByteBuffer buffer = ByteBuffer.allocate(8192); 
int read = client.getInputStream().read(buffer2.array()); 
System.out.println("read: " + read); 

// read: 7 

for (int i = 0; i < read; i++) { 
    int j = buffer.get(i) & 0xff; 
    System.out.println("i: " + i + " => " + j + "=>" + new BigInteger(j + "").toString(2)); 
} 

//i: 0 => 129=>10000001 
//i: 1 => 129=>10000001 
//i: 2 => 195=>11000011 
//i: 3 => 235=>11101011 
//i: 4 => 4=>100 
//i: 5 => 96=>1100000 
//i: 6 => 187=>10111011 

私はこの

secondByte AND 0111 1111 
を行う場合

(i:1)の結果は "1"です。これは、1バイトのデータしかないと思います。それではなぜ7歳ですか?あなたの第二の問題については

+2

デコードアルゴリズムについては、http://stackoverflow.com/questions/8125507/how-can-i-send-and-receive-websocket-messages-on-the-server-side/8125509#8125509をご覧ください。 。 – pimvdb

答えて

1

- 私は、上記のリンクで説明したように、クライアントからサーバーへのデータは常にがマスクされています。マスクは4バイトを取る。

ので、実際のデータの長さは、確かに第二バイトの1だけが最後の7ビットは、長さについて何かを言うである - 最初のビットは、これだけ1ある000 0001を取得するための1つを破棄しません。この場合、次のように

バイトが分類される:

  • 0,1メタバイト
  • 3、4、5であり、6はマスクである
  • 7は、データ
あります

データを取得するには、data XOR masks[data_index MOD 4]、つまりこの場合は187 XOR 195、つまり120 - xの文字コードを計算します。

+0

それは今実行する:)感謝のおかげで! – user1150445

+0

@ user1150445:あなたの質問を解決した場合、回答を受け入れてください。ありがとう! – pimvdb

関連する問題