2010-12-13 12 views
1

JavaベースのHTML5 websocketサーバー(v76)を構築しようとしていて、ハンドシェイクに問題があります。 v76をサポートしているオープンソースのJavaソリューションがいくつかありますが、どれもうまく動作していないようです。HTML5 Websocketサーバーハンドシェイク(v.76)(Java)

私はハンドシェイクの応答が正しいと確信しています(少なくとも2つのキーの応答を計算しています)。私の質問:JavaはデフォルトでBig Endianですか? 2つの主要な答え+応答バイトの連結がハンドシェイクの答えなので、私は複数の型変換(文字列への文字列への連結、文字列への2つのintの連結、バイトへの変換、応答バイトとの連結) MD5エンコーディング)、特に必要なものがありますか?私の応答は常にWireshark(バイト数)を使って正確なようですが、クライアントにはデバッグ情報がないので、なぜ私のハンドシェイクが失敗しているのか分かりません。

コードをサポートする回答があれば、私にとって非常に貴重なものになります。

答えて

0

Jetty 7はWebソケットをサポートしており、オープンソースです。インスピレーションを得るかもしれません(でも、私はあなたのアプリケーションにJettyを埋め込み、それを使って作業することをお勧めします)。

http://blogs.webtide.com/gregw/entry/jetty_websocket_server

0

あなたは私の実装を試すことができます。 はhttps://github.com/TooTallNate/Java-WebSocket

それは、現在のドラフト75および76をサポートしています。 ChromeとSafariの現在のバージョンで確認済みです。がんばろう!

1

これは、ウェブソケットバージョン76のハンドシェイクプロデューサの実例です。仕様(http://tools.ietf.org/pdf/draft-hixie-thewebsocketprotocol-76.pdf)の例を使用して、出力を文字列として出力すると、正しい答えが得られます。

public byte[] getHandshake (String firstKey, String secondKey, byte[] last8) 
    { 
     byte[] toReturn = null; 
     //Strip out numbers 
     int firstNum = Integer.parseInt(firstKey.replaceAll("\\D", "")); 
     int secondNum = Integer.parseInt(secondKey.replaceAll("\\D", "")); 

     //Count spaces 
     int firstDiv = firstKey.replaceAll("\\S", "").length(); 
     int secondDiv = secondKey.replaceAll("\\S", "").length(); 

     //Do the division 
     int firstShake = firstNum/firstDiv; 
     int secondShake = secondNum/secondDiv; 

     //Prepare 128 bit byte array 
     byte[] toMD5 = new byte[16]; 
     byte[] firstByte = ByteBuffer.allocate(4).putInt(firstShake).array(); 
     byte[] secondByte = ByteBuffer.allocate(4).putInt(secondShake).array(); 

     //Copy the bytes of the numbers you made into your md5 byte array 
     System.arraycopy(firstByte, 0, toMD5, 0, 4); 
     System.arraycopy(secondByte, 0, toMD5, 4, 4); 
     System.arraycopy(last8, 0, toMD5, 8, 8); 
     try 
     { 
      //MD5 everything together 
      MessageDigest md5 = MessageDigest.getInstance("MD5"); 
      toReturn = md5.digest(toMD5); 
     } 
     catch (NoSuchAlgorithmException e) 
     { 
      e.printStackTrace(); 
     } 

     return toReturn; 
} 

私はこれを書いていますので、いつでもどこでも使用してください。

EDIT:他のいくつかの問題に遭遇しました。ハンドシェイクに「答え」をバイトとして書き込む必要があります。それをストリングとしてストリームに書き戻そうとすると失敗します(char変換と何か関係がありますか?)。また、レスポンスの残りの部分を仕様書に示されているとおりにハンドシェイクに書いていることを確認してください。

関連する問題