Java ServerSocket WebSocket ответ - PullRequest
       10

Java ServerSocket WebSocket ответ

1 голос
/ 15 июля 2011

Я пытаюсь создать свой собственный сервер WebSocket с Java.

Когда мой клиент подключается, я получаю следующий запрос:

(14): GET / HTTP/1.1
(18): Upgrade: WebSocket
(19): Connection: Upgrade
(20): Host: localhost:8483
(24): Origin: http://localhost
(45): Sec-WebSocket-Key1: P3$04 H85Zf# 9 9d a0 x10[
(34): Sec-WebSocket-Key2: 416393 2  560Y
(0): 

(Числа в скобках, скобки, двоеточия и пробелы после этого являются только тем, что я добавляю для команды System.out.println ()). Числа в скобках - это длина строки в байтах.

Сначала я обрабатываю запрос, используя эту функцию:

public boolean processHandshake(int lineNumber, String line){

    if(handshakeProcessed || lineNumber > 9 || lineNumber < 1){

        return false;

    }

    switch(lineNumber){

        case 1:{ handshakeGetLocation = line.replace("GET ", "").replace(" HTTP/1.1", ""); break; }
        case 2:{ handshakeUpgrade = line.replace("Upgrade: ", ""); break; }
        case 3:{ handshakeConnection = line.replace("Connection: ", ""); break; }
        case 4:{ handshakeHost = line.replace("Host: : ", ""); break; }
        case 5:{ handshakeOrigin = line.replace("Origin: ", ""); break; }
        case 6:{ handshakeSecWebSocketKey1 = line.replace("Sec-WebSocket-Key1: ", ""); break; }
        case 7:{ handshakeSecWebSocketKey2 = line.replace("Sec-WebSocket-Key2: ", ""); handshakeProcessed = false; break; }
        case 8:{ handshakeProcessed = true; }
        case 9:{ handshakeProcessed = true; }

    }

    return true;

}

Теперь, согласно этой статье и, предполагая, что это первая версия протокола, которую мне нужно обработать, мне было интересно, как работать с частными производными:

Дело в том, что для каждого ключа мне нужно разделить количество цифр на количество пробелов. Я делал это так:

private double calculateKeyReply(String key){

    double numCount = key.replaceAll("[^0-9]", "").length();
    double spaceCount = key.replaceAll("[^\\ ]", "").length();

    System.out.println(numCount+"/"+spaceCount+"="+numCount/spaceCount);

    return numCount/spaceCount;

}

И вызов следующей функции (replyHandshake()):

String handshake;

handshake = "HTTP/1.1 101 WebSocket Protocol Handshake\n";
handshake += "Upgrade: "+handshakeUpgrade+"\n"; // handshakeUpgrade and the following variables are instance variables I set when I process the request
handshake += "Connection: "+handshakeConnection+"\n";
handshake += "Sec-WebSocket-Origin: "+handshakeOrigin+"\n";
handshake += "Sec-WebSocket-Location: "+handshakeOrigin.replace("http", "ws")+handshakeGetLocation+"\n";
handshake += "Sec-WebSocket-Protocol: sample\n";
// handshake += "\n";

String nums = calculateKeyReply(handshakeSecWebSocketKey1)+""+calculateKeyReply(handshakeSecWebSocketKey2);

MessageDigest md5Digestor = MessageDigest.getInstance("MD5");
String md5 = new String(md5Digestor.digest(nums.getBytes()));

handshake += md5;

return handshake;

А потом, где-то еще:

out.println(replyHandshake());

Я что-то не так делаю? Я тестирую его с последней версией Google Chrome.

Заранее спасибо!

Ответы [ 2 ]

2 голосов
/ 14 августа 2011

Если вы пройдете лишнюю милю и создадите сервер для себя с нуля сегодня, я бы выбрал самую последнюю версию протокола (версия 8, черновик 10).

Вышеуказанное рукопожатие является устаревшей версией.

Chrome 14 и Firefox 7/8 поддерживают последние версии. Firefox 6 имеет (по умолчанию отключена) старую версию. Chrome вполне может отказаться от поддержки любой версии <8. </p>

0 голосов
/ 15 декабря 2011

Вы также можете использовать библиотеку Apache под названием MINA , в которой есть библиотека для создания веб-сокетов .

...