1

So, I have the following code working for connecting to the socket. But I am trying to invoke (or listen to) OnText event from the WebSocketListener, to get the data received from websocket. Any help is much appreciated.

public class WebSocketListener implements WebSocket.Listener { 
    @Override
    public void onOpen(WebSocket webSocket) {
        webSocket.request(1);
        _logger.trace("Connected to WebSocket.");
        _logger.debug("WebSocket Listener has been opened for requests.");
        WebSocket.Listener.super.onOpen(webSocket);
    }

    @Override
    public CompletionStage<?> onText(WebSocket webSocket, CharSequence data, boolean last) {
        _logger.trace("onText: ", data);
        webSocket.request(1);
        _logger.info("onText() completed.");

        JSONObject response = new JSONObject(data.toString());
        //
        // How to return it to the class requesting/listening on it?
        //

        return new CompletableFuture().newIncompleteFuture().thenAccept(System.out::println);
        //return WebSocket.Listener.super.onText(webSocket, data, last);
    }

    @Override
    public CompletionStage<?> onClose(WebSocket webSocket, int statusCode, String reason) {
        _logger.debug("WebSocket Listener has been closed with statusCode: {}, and cause: {}",statusCode, reason);
        webSocket.sendClose(WebSocket.NORMAL_CLOSURE, "ok");
        return new CompletableFuture<Void>();
        //return WebSocket.Listener.super.onClose(webSocket, statusCode, reason);
    }

    @Override
    public void onError(WebSocket webSocket, Throwable error) {
        _logger.error("A " + error.getCause() + " exception was thrown.");
        _logger.error("Message: " + error.getLocalizedMessage());
        webSocket.abort();
    }

    @Override
    public CompletionStage<?> onPing(WebSocket webSocket, ByteBuffer message){
        webSocket.request(1);
        _logger.trace("Ping: Client ---> Server");
        _logger.trace(message.asCharBuffer().toString());
        _logger.trace("Ping completed.");
        // return new CompletableFuture().completedFuture​("Ping completed.").thenAccept(System.out::println);
        return new CompletableFuture().newIncompleteFuture().thenAccept(System.out::println);
    }

    @Override
    public CompletionStage<?> onPong(WebSocket webSocket, ByteBuffer message){
        webSocket.request(1);
        _logger.trace("Pong: Client ---> Server");
        _logger.trace(message.asCharBuffer().toString());
        //return new CompletableFuture().completedFuture​("Pong completed.").thenAccept(System.out::println);
        _logger.trace("Pong completed.");
        return new CompletableFuture().newIncompleteFuture().thenAccept(System.out::println);
    }
}

Following is the WebSocketClient that would handle creating the socket, connect, reconnect, login, logout, getSession from the WebSocket API.

private static CompletableFuture<WebSocket> _websocket_cf;
private static WebSocket _webSocket;
public WebSocketClient() {
        try {
            _secure = true;

            WebSocketListener wsListener = new WebSocketListener();
            TrustingHttpClient client = HttpUtil.getDefaultHttpClient().addTrustedHost(10.200.60.15);

            _websocket_cf = client
                    .newWebSocketBuilder()
                    .buildAsync(URI.create("wss://10.200.60.15/remoteapi"), wsListener); //
            _webSocket = _websocket_cf.join();
            _logger.info("WebSocket created.");
        }
        catch (Exception ex) {
            _logger.error("Failed to create WebSocket. ", ex);
        }
    }

    public WebSocket getWebSocket() { return _webSocket; }

.....
}

No, I would like to get the data received from OnText event, here in this method.

Public class SocketExample {
    private WebSocketClient _wsc;

    private void getData(){
          _wsc = new WebSocketClient();
          WebSocket ws = _wsc.getWebSocket();

          // get the data received in OnText event here ?
    }
}

Thanks for your help.

snstuff
  • 299
  • 1
  • 3
  • 9
  • So, what's the question? – pavel Jul 01 '19 at 14:44
  • The questions are added in the code itself - as comments. Sorry, if that was not very intuitive. – snstuff Jul 02 '19 at 15:21
  • This WebSocket client provides a callback-based API. If you want your code to initiate the read instead and block or return a `CompletableFuture`, you will have to provide a necessary wrapper yourself. – pavel Jul 02 '19 at 16:16
  • I want to treat it in a synchronous way, API Request and Response. – snstuff Jul 02 '19 at 16:40
  • Then you will have to provide a necessary wrapper yourself. You'll need to arrange for a queue of some sort that will be populated by the callback and drained by calls from your code. – pavel Jul 02 '19 at 16:49
  • I should also add that that code is strange in the way it uses `CompletableFuture` instances to return from `Listener`'s methods. – pavel Jul 03 '19 at 13:03

0 Answers0