簡體   English   中英

HTML5 Websocket服務器握手(v.76)(Java)

[英]HTML5 Websocket Server handshake (v.76) (Java)

我正在嘗試構建基於Java的HTML5 Websocket服務器(v76),握手時遇到問題。 有一些開源Java解決方案據稱支持v76,但似乎都不起作用。

我確定我的握手響應是正確的(至少計算了兩個鍵的響應)。 我的問題:Java默認是Big Endian嗎? 由於兩個關鍵答案+響應字節的連接是握手答案,因此我必須進行多種類型轉換(將字符串轉換為int,將兩個int合並為字符串,然后轉換為byte並使用響應字節進行concat,然后MD5編碼),是否特別需要尋找? 使用Wireshark(字節數),我的響應似乎總是准確的,但是由於客戶端沒有調試信息,因此很難說出握手失敗的原因。

任何支持性答案或有效代碼對我來說都是非常寶貴的。

嘿,這是websockets版本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;
}

我寫了這個,所以隨時隨地都可以使用它。

編輯:我遇到的其他一些問題-您必須將“答案”以字節的形式寫入握手。 如果嘗試將其作為字符串寫回到流中,它將失敗(一定與char轉換有關嗎?)。 另外,請確保您將其余的響應完全按照規范中的說明編寫。

Jetty 7支持Web套接字,並且是開源的。 您可能會找到靈感(但我建議您只是將Jetty嵌入應用程序中並完成它)。

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

您可以嘗試我的實現: https : //github.com/TooTallNate/Java-WebSocket

目前支持草案75和76。 已通過當前版本的Chrome和Safari驗證。 祝好運!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM