Example usage for io.vertx.core.http ServerWebSocket frameHandler

List of usage examples for io.vertx.core.http ServerWebSocket frameHandler

Introduction

In this page you can find the example usage for io.vertx.core.http ServerWebSocket frameHandler.

Prototype

@Override
    ServerWebSocket frameHandler(Handler<WebSocketFrame> handler);

Source Link

Usage

From source file:io.advantageous.qbit.vertx.http.server.VertxServerUtils.java

License:Apache License

public WebSocket createWebSocket(final ServerWebSocket vertxServerWebSocket) {

    final MultiMap<String, String> params = paramMap(vertxServerWebSocket);

    final MultiMap<String, String> headers = vertxServerWebSocket.headers().size() == 0 ? MultiMap.empty()
            : new MultiMapWrapper(vertxServerWebSocket.headers());

    /* Create a websocket that uses vertxServerWebSocket to forwardEvent messages. */
    final WebSocket webSocket = webSocketBuilder().setUri(vertxServerWebSocket.uri())
            .setRemoteAddress(vertxServerWebSocket.remoteAddress().toString())
            .setWebSocketSender(new WebSocketSender() {
                @Override// w w  w  .  ja v a  2 s. com
                public void sendText(String message) {
                    vertxServerWebSocket.writeFinalTextFrame(message);
                }

                @Override
                public void sendBytes(byte[] message) {
                    vertxServerWebSocket.writeFinalBinaryFrame(Buffer.buffer(message));
                }

                @Override
                public void close() {
                    vertxServerWebSocket.close();
                }
            }).setHeaders(headers).setParams(params).build();

    /* Handle open. */
    webSocket.onOpen();

    /* Handle close. */
    vertxServerWebSocket.closeHandler(event -> webSocket.onClose());

    final Buffer[] bufferRef = new Buffer[1];

    final int[] count = new int[1];

    /* Handle frame. */
    vertxServerWebSocket.frameHandler(event -> {

        count[0]++;

        if (event.isFinal()) {
            //If the count is 1 then all of the data is in bufferRef, else all of the data but the last bit is in bufferRef.
            final Buffer finalBuffer = count[0] > 1 ? createNewBuffer(bufferRef[0], event.binaryData())
                    : event.binaryData();
            if (event.isBinary()) {
                ((NetSocketBase) webSocket).setBinary();
                webSocket.onBinaryMessage(finalBuffer.getBytes());
            } else {
                webSocket.onTextMessage(finalBuffer.toString("UTF-8"));
            }

            count[0] = 0;
            bufferRef[0] = null;
        } else {
            bufferRef[0] = createNewBuffer(bufferRef[0], event.binaryData());
        }
    });

    /* Handle error. */
    vertxServerWebSocket.exceptionHandler(event -> {
        if (event instanceof Exception) {
            webSocket.onError((Exception) event);
        } else {
            webSocket.onError(new Exception(event));
        }
    });

    return webSocket;
}

From source file:org.entcore.workspace.controllers.AudioRecorderHandler.java

License:Open Source License

@Override
public void handle(final ServerWebSocket ws) {
    ws.pause();/*from   w  ww .  j  a  v a2  s.com*/
    String sessionId = CookieHelper.getInstance().getSigned(SESSION_ID, ws);
    UserUtils.getSession(Server.getEventBus(vertx), sessionId, new Handler<JsonObject>() {
        public void handle(final JsonObject infos) {
            if (infos == null) {
                ws.reject();
                return;
            }
            final String id = ws.path().replaceFirst("/audio/", "");
            eb.send(AudioRecorderWorker.class.getSimpleName(),
                    new JsonObject().put("action", "open").put("id", id),
                    handlerToAsyncHandler(new Handler<Message<JsonObject>>() {
                        @Override
                        public void handle(Message<JsonObject> m) {
                            if ("ok".equals(m.body().getString("status"))) {
                                ws.frameHandler(new Handler<WebSocketFrame>() {
                                    @Override
                                    public void handle(WebSocketFrame frame) {
                                        if (frame.isBinary()) {
                                            log.debug("frame handler");
                                            eb.send(AudioRecorderWorker.class.getSimpleName() + id,
                                                    frame.binaryData().getBytes(),
                                                    new DeliveryOptions().setSendTimeout(TIMEOUT),
                                                    new Handler<AsyncResult<Message<JsonObject>>>() {
                                                        @Override
                                                        public void handle(
                                                                AsyncResult<Message<JsonObject>> ar) {
                                                            if (ar.failed() || !"ok".equals(
                                                                    ar.result().body().getString("status"))) {
                                                                ws.writeTextMessage("audio.chunk.error");
                                                            }
                                                        }
                                                    });
                                        } else {
                                            final String command = frame.textData();
                                            if (command != null && command.startsWith("save-")) {
                                                save(id, command.substring(5), infos, ws);
                                            } else if ("cancel".equals(command)) {
                                                cancel(id, ws);
                                            } else if ("rawdata".equals(command)) {
                                                disableCompression(id, ws);
                                            }
                                        }
                                    }
                                });
                                ws.closeHandler(new Handler<Void>() {
                                    @Override
                                    public void handle(Void event) {
                                        cancel(id, null);
                                    }
                                });
                                ws.resume();
                            } else {
                                ws.writeTextMessage(m.body().getString("message"));
                            }
                        }
                    }));
        }
    });
}