Как получать websocket-сообщения с сервера Vert.x в Javascript?

Я пытаюсь создать http-сервер, включая веб-сокеты с Vert.x на Java, при написании клиента на Javascript без vertx.js. Я избегаю использования Vert.x в клиенте, потому что он должен оставаться ориентированным на браузер (такие инструменты, как browserfy, не преуспели в преобразовании CommonJS-стандарта Vert.x в код, который может использоваться браузерами).

После завершения тестового кода для сервера и клиента я попробовал простой пример отправки сообщения на сервер, получения его данных и ответа произвольным ответом. Сервер получил сообщение и смог прочитать его содержимое. Однако клиент получил только сообщение, не получив предполагаемого содержимого. Клиент не смог преобразовать данные события, полученные веб-сервером, в строку (вообще никаких строковых данных?). Используя indexof.js для определения байтового размера данные события привели к постоянному размеру 34 байта после изменения содержимого, отправляемого сервером, несколько раз. Я попытался использовать writeMessage, а также метод записи на стороне сервера для отправки данных в клиентский веб-сокет. Результаты остались прежними.

Почему мой клиент получает в веб-сокете только данные постоянного размера и как заставить их работать?

Спасибо за ваши предложения!

РЕДАКТИРОВАТЬ: Я обмениваю методы write и writeMessage на writeFrame. С writeFrame можно отправлять двоичные данные, а также простой текст. Отправка текста таким способом с сервера на основе Java на клиент на основе Javascript работает нормально. Я до сих пор не знаю, как обрабатывать двоичные сообщения на стороне клиента, но, тем не менее, это было бы полезно. Хотя текстовые сообщения работают, предполагается, что они имеют тот же размер (34 байта). Я думал, что полученный объект данных будет различаться по размеру, но, похоже, это просто объект, который где-то указывает на фактические данные.

----------------------------------------------- -

Клиентский код был написан во время (успешных) тестов с сервлетами Java и веб-сокетами:

var wsUri = "ws://" + document.location.host + document.location.pathname + "chat";

var websocket = new WebSocket(wsUri);
websocket.onerror = function(evt) { onError(evt) };
websocket.onopen = function (evt) { onOpen(evt) };

function onError (evt)
{
    debugMessage('<span style="color: red;">ERROR:</span> ' + evt.data);
}

function onOpen (evt)
{
//    debugMessage("Connected to " + wsUri);
    debugMessage("GOTCHA!");
}

websocket.onmessage = function (evt) { onMessage(evt) };

function onMessage (evt)
{
    debugMessage(evt.toString());
    debugMessage(evt.data.toString());
    debugMessage(sizeof(evt.data));
}

function sendMessage (msg)
{
    websocket.send(msg);
}

function sendDebugMessage ()
{
    websocket.send("Hiho Wursty!");
    debugMessage("Did send Wursty-message.");
}

Серверная часть соответствует официальной документации Vert.x, а также другой другое онлайн-руководство:

server = vertx.createHttpServer();

server.requestHandler(request -> {
    handleRequest(request);
});

server.websocketHandler(ws -> {
    print("Websocket-handshake...");
    print("path = " + ws.path());
    print("uri = " + ws.uri());
    print("localAdress = " + ws.localAddress().toString());
    print("remoteAddress = " + ws.remoteAddress());
    print(ws.toString());

    if (!ws.path().equals("/chat")) {
        ws.reject();
    } else {
        SharedData sd = vertx.sharedData();
        LocalMap<String, String> wsChatSessions =
                sd.getLocalMap("ws.chat.sessions");

        wsChatSessions.put(ws.textHandlerID(), ws.toString());

        ws.closeHandler(ch -> {
            print("Closing ws-connection to client " + ws.textHandlerID());
            wsChatSessions.remove(ws.textHandlerID());
        });

        ws.handler(new Handler<Buffer>(){
            @Override
            public void handle(final Buffer data) {
                String msg = data.getString(0, data.length());
                print("Message from ws-client " + ws.textHandlerID() 
                        + ": " + msg);
                Buffer resp = Buffer.buffer();
                resp.appendString("O Ding Dong asd asda sdasd a"
                        + "asdasd asd asdasda sdas dasd adads asd as"
                        + "as dasd asd asd asd asdasd asdasdasd "
                        + "asdasd asd asd asd asd asda sdasd asd !");
                ws.writeMessage(resp);
                ws.write(resp);
            }
        });
    }
});

server.listen(port, res -> {
    if (res.succeeded()){
        print("Listening...");
    } else{
        print("Failed to bind! -> Server is not listening"
            + " to incoming client connections.");
    }
});

person Florian R. Klein    schedule 04.08.2015    source источник


Ответы (1)


Причина, по которой я получал только сообщения размером 0 байт, была относительно простой: в Javascript-websocket можно определить тип (двоичных) данных, получаемых веб-сокетом от сервера, binaryType. По умолчанию установлено "blob". В моем случае я предполагал получить буферы массивов. Установка этого параметра соответственно заставила веб-сокет передавать данные, как ожидалось:

websocket.binaryType = "arraybuffer";

Чтобы использовать его, по-прежнему необходимо создать массив из буфера массива. В моем случае я создал массив беззнаковых 8-битных целых чисел:

var dataBytes = new Uint8Array(evt.data);

Теперь данные готовы к обработке последующим кодом.

person Florian R. Klein    schedule 11.08.2015