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

标签 java html websocket

我正在尝试构建一个基于 Java 的 HTML5 websocket 服务器 (v76),但在握手方面遇到问题。有一些开源 Java 解决方案据称支持 v76,但似乎都不起作用。

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

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

最佳答案

嘿,这是 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;
}

这是我写的,所以请随意使用它。

编辑:我遇到的一些其他问题 - 您必须将握手的“答案”写为字节。如果您尝试将其作为字符串写回流,它将失败(一定与字符转换有关?)。另外,请确保您编写的握手响应的其余部分完全按照规范中所示。

关于java - HTML5 Websocket 服务器握手 (v.76) (Java),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4426414/

相关文章:

Javascript 和 Sqlite

node.js - 端口 80 上的 SocketIO 与 Express 一起

http - websocket、http、spdy

java - 无需在浏览器中登录即可将视频上传到 youtube

java - 异步服务中的 Spring 请求范围?通过 threadLocal 变量实现 ThreadScope,加上一个 AsyncAspect 来清理

java - 分析应用程序的 Tomcat 配置

javascript - 悬停时动画不透明度变化不起作用

java - Java 中不可修改的 vector

HTML 链接有时无法正常工作

javascript - Node.js websocket.io 光标示例 我看不到它?