Помощь по Websocket! - PullRequest
       7

Помощь по Websocket!

0 голосов
/ 18 февраля 2011

Я работаю над приложением websocket. У меня есть сервер, который написан на C #. Я проверил это с помощью другого приложения C # для отправки и получения данных. Проблема возникает, когда я использую JavaScript в Chrome Developer Tool (консоли) и использую Websockets для подключения к моему серверу.

  1. Я получаю строку заголовка из скрипта websocket с двумя ключами и последними 8 символами для хеширования.

  2. Я использовал ключи строки заголовка для генерации хеш-кода и создания заголовка для отправки обратно в chrome (сценарий j в инструменте разработчика).

Вопросы: -

  1. событие onopen никогда не запускается, и веб-сокет не получает заголовок (я полагаю). Я использую onerror для захвата любых ошибок. Что никогда не происходит.

  2. Состояние готовности на веб-сокете равно 0 или 2 (всегда).

    • Но когда я отправляю ответ на отключение от сервера, websocket запускает метод onclose. (Поэтому я предполагаю, что он был открыт, но не готов к общению)

Любые предложения ??????? Вот JavaScript, если это поможет.

websocket = new WebSocket('ws://My server IP here:8080'); 

try {
    websocket.onopen = function(evt) { 
        open(evt)
        //websocket.send("Message to send");
        alert("Message is sent...");
    }
}
catch(err) { 
    debug(err,'error')
} 

websocket.onerror = function(evt) {
    error(evt)
} 

websocket.onclose = function(evt) { 
    close(evt) 
}

websocket.onmessage = function(evt) {
    message(evt) 
}

function open(evt) { 
    alert("CONNECTED"); 
    doSend("WebSocket rocks"); 
} 

function error(evt) {
    alert (evt.data)
}

function close(evt) { 
    alert("DISCONNECTED"); 
} 

function message(evt) { 
    alert(evt.data); 
} 

function doSend(message) {
    alert(message); 
    websocket.send(message); 
}

И заголовок, который я отправил обратно

HTTP / 1.1 101 WebSocket Protocol Handshake

Обновление: WebSocket

Подключение: обновление

Sec-WebSocket-Origin: chrome: // newtab

Sec-WebSocket-Location: ws: // IP моего сервера: 8080 ?? я ??? м?! ?? 9?

Спасибо всем.

Ответы [ 2 ]

2 голосов
/ 07 декабря 2011

Похоже, вы пытаетесь ответить на запрос рукопожатия без соответствующего ответа на вызов.Как упоминал Робин, рукопожатие теперь более сложное и включает в себя вызов для более новых версий протокола WebSocket. Это хорошая статья , которая более подробно объясняет рукопожатие версии 76.

Вот пример кода, который определяет версию протокола WebSocket и отвечает соответствующим ответом.(Это на Java, поэтому YMMV, но оно должно указывать вам правильное направление.)

// Create the WebSocket handshake response.
HttpResponse res = new DefaultHttpResponse(HTTP_1_1,
    new HttpResponseStatus(101, "Web Socket Protocol Handshake"));
res.addHeader(Names.UPGRADE, WEBSOCKET);
res.addHeader(CONNECTION, Values.UPGRADE);

// Fill in the headers and contents depending on handshake method.
// New handshake specification has a challenge.
if (req.containsHeader(SEC_WEBSOCKET_KEY1)
        && req.containsHeader(SEC_WEBSOCKET_KEY2)) {

    // New handshake method with challenge
    res.addHeader(SEC_WEBSOCKET_ORIGIN, req.getHeader(ORIGIN));
    res.addHeader(SEC_WEBSOCKET_LOCATION, getWebSocketLocation(req));

    String protocol = req.getHeader(SEC_WEBSOCKET_PROTOCOL);

    if (protocol != null) {
        res.addHeader(SEC_WEBSOCKET_PROTOCOL, protocol);
    }

    // Calculate the answer of the challenge.
    String key1 = req.getHeader(SEC_WEBSOCKET_KEY1);
    String key2 = req.getHeader(SEC_WEBSOCKET_KEY2);
    int a = (int) (Long.parseLong(key1.replaceAll("[^0-9]", "")) / key1
            .replaceAll("[^ ]", "").length());
    int b = (int) (Long.parseLong(key2.replaceAll("[^0-9]", "")) / key2
            .replaceAll("[^ ]", "").length());
    long c = req.getContent().readLong();
    ChannelBuffer input = ChannelBuffers.buffer(16);
    input.writeInt(a);
    input.writeInt(b);
    input.writeLong(c);
    ChannelBuffer output = ChannelBuffers
            .wrappedBuffer(MessageDigest.getInstance("MD5").digest(
                    input.array()));
    res.setContent(output);
} else {
    // Old handshake method with no challenge:
    res.addHeader(WEBSOCKET_ORIGIN, req.getHeader(ORIGIN));
    res.addHeader(WEBSOCKET_LOCATION, getWebSocketLocation(req));
    String protocol = req.getHeader(WEBSOCKET_PROTOCOL);
    if (protocol != null) {
        res.addHeader(WEBSOCKET_PROTOCOL, protocol);
    }
}

// Send the response...
0 голосов
/ 19 февраля 2011

Реализуете ли вы правильную версию протокола Websockets?Chrome перешел на версию 76 , что означает, что рукопожатие является более сложным, чем было.Если ваш клиент Javascript не может правильно подключиться, возможно, это причина.

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