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

时间:2010-12-13 06:50:52

标签: java html5 websocket

我正在尝试构建基于Java的HTML5 websocket服务器(v76)并且在握手方面存在问题。有一些开源Java解决方案可能支持v76,但它们似乎都不起作用。

我确信我的握手响应是正确的(至少计算两个键的响应)。我的问题:Java默认是Big Endian吗?由于两个关键答案+响应字节的串联是握手答案,我必须进行多种类型的转换(字符串到int,将两个整数连接成一个字符串,然后转换为字节并用响应字节连接,然后MD5编码),有什么特别需要我寻找的吗?使用Wireshark(字节数),我的响应似乎总是准确的,但由于客户端没有调试信息,因此很难说出为什么我的握手失败了。

任何支持性答案或工作代码对我来说都非常有价值。

3 个答案:

答案 0 :(得分:1)

嘿,这是websockets版本76的握手生成器的一个工作示例。如果您使用spec(http://tools.ietf.org/pdf/draft-hixie-thewebsocketprotocol-76.pdf)中的示例并将输出打印为String,则会生成正确的答案。

    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;
}

我写了这个,所以随时随地使用它。

编辑:我遇到的其他一些问题 - 您必须将握手的'答案'写为字节。如果你尝试将它作为String写回流中,它将失败(必须与char转换有关吗?)。另外,请确保完全按照规范中的说明将剩余的响应写入握手。

答案 1 :(得分:0)

Jetty 7支持Web套接字,并且是开源的。你可能会找到灵感(但我建议你在你的应用程序中嵌入Jetty并完成它)。

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

答案 2 :(得分:0)

您可以尝试我的实施: https://github.com/TooTallNate/Java-WebSocket

目前支持75和76草案。已通过Chrome和Safari的当前版本验证。祝你好运!