HTML5 Websocket Server рукопожатие (v.76) (Java) - PullRequest
1 голос
/ 13 декабря 2010

Я пытаюсь создать сервер веб-сокета HTML5 на основе Java (v76) и у меня проблемы с рукопожатием.Существует несколько Java-решений с открытым исходным кодом, которые предположительно поддерживают v76, но ни одно из них, похоже, не работает.

Я уверен, что мой ответ на рукопожатие правильный (по крайней мере, вычисление ответов двух ключей)Мой вопрос: является ли Java по умолчанию Big Endian?Поскольку объединение двух ключевых ответов + байтов ответа является ответом рукопожатия, мне нужно выполнить несколько преобразований типов (строка в int, объединить два целых числа в строку, затем преобразовать в байт и объединить с байтами ответа, затемКодировка MD5), что-то конкретно мне нужно искать?Мой ответ всегда кажется точным при использовании Wireshark (число байтов), но, поскольку у клиентов нет отладочной информации, трудно сказать, почему мои рукопожатия терпят неудачу.

Любые вспомогательные ответы или рабочий код будут Чрезвычайно ценными для меня.

Ответы [ 3 ]

1 голос
/ 04 июня 2011

Эй, это рабочий пример производителя рукопожатия для веб-сокетов версии 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;
}

Я написал это, так что не стесняйтесь использовать его где угодно.

РЕДАКТИРОВАТЬ: Некоторые другие проблемы, с которыми я столкнулся - вы ДОЛЖНЫ записать ответ на рукопожатие в байтах. Если вы попытаетесь записать его обратно в поток в виде строки, произойдет сбой (должно быть что-то делать с преобразованием символов?). Кроме того, убедитесь, что вы пишете остальную часть ответа на рукопожатие именно так, как показано в спецификации.

0 голосов
/ 18 марта 2011

Вы можете попробовать мою реализацию: https://github.com/TooTallNate/Java-WebSocket

В настоящее время поддерживается черновик 75 и 76.Проверено с текущими версиями Chrome и Safari.Удачи!

0 голосов
/ 13 декабря 2010

Jetty 7 поддерживает веб-сокеты и является открытым исходным кодом.Вы можете найти вдохновение (но я бы посоветовал вам просто встроить Jetty в ваше приложение и покончить с этим).

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...