Требуется помощь с простым чистым примером клиента Java 11 WebSocket - PullRequest
0 голосов
/ 27 марта 2019

Похоже, очень мало Java 11 (чисто Java, не основанного на фреймворке) WebSocket клиент примеров кода в Интернете, поэтому я надеюсь, что StackOverflow снова мне поможет.

Это - самое близкое, что я нашел, но, к сожалению, для моих (начинающих) глаз, оно не является полным решением, показывающим, как использовать данные из прослушивателя WebSocket.

Рассматривая реализацию WebSocket.Listener, метод обратного вызова onText , который я предполагаю, предоставит то, что мне нужно, но я пытаюсь выяснить, как вернуть объект CompletionStage и какую-то строкуданные из сокета.

Это тестовый код, который у меня есть.

Буду признателен за помощь.Спасибо

    public class Main {

        public static void main(String[] args) {

           WebSocketClient wsc = new WebSocketClient();
           wsc.startSocket("ws://demos.kaazing.com/echo");

           int i = 0;   

           // Bad, very bad
           do {} while (i == 0);
        }
    }


    public class WebSocketClient implements WebSocket.Listener {

        @Override
        public void onOpen(WebSocket webSocket) {
           //...
            System.out.println("Go...Open".concat(
                    webSocket.getSubprotocol()));
        }

        @Override
        public CompletionStage<?> onText(WebSocket webSocket, CharSequence data, boolean last) {
           //...
            System.out.println(data.toString());

            // How do I return the CompletionStage object
            // return CompletionStage<String>
        }

        @Override
        public void onError(WebSocket webSocket, Throwable error) {
           //..
            System.out.println("Bad day! ".concat(webSocket.toString()));
        }

        void startSocket(String connection) {
            CompletableFuture<WebSocket> server_cf = HttpClient.
                    newHttpClient().
                    newWebSocketBuilder().
                    buildAsync(URI.create(connection),
                            new WebSocketClient());
            WebSocket server = server_cf.join();
            server.sendText("Hello!", true);
        }
    }

1 Ответ

2 голосов
/ 02 апреля 2019

Ниже вы найдете рабочий пример. Я внес некоторые изменения в ваш код выше:

  • onOpen необходимо вызвать request(1) на веб-сокете (используя реализацию по умолчанию) для получения дальнейших вызовов.
  • перемещенный метод startSocket в основной метод
  • заменил занятое ожидание на защелку обратного отсчета
  • объявленный класс WebSocketClient как (статический) внутренний класс

но за этими (косметическими) изменениями программа следует вашей идее, т. Е. Сначала устанавливается соединение с веб-сокетом, а после успешного построения текст Hello! отправляется на эхо-сервер. Это также можно сделать напрямую в методе onOpen.

    import java.net.URI;
    import java.net.http.HttpClient;
    import java.net.http.WebSocket;
    import java.util.concurrent.CompletionStage;
    import java.util.concurrent.CountDownLatch;

    public class Main {

        public static void main(String[] args) throws Exception {
            CountDownLatch latch = new CountDownLatch(1);

            WebSocket ws = HttpClient
                    .newHttpClient()
                    .newWebSocketBuilder()
                    .buildAsync(URI.create("ws://demos.kaazing.com/echo"), new WebSocketClient(latch))
                    .join();
            ws.sendText("Hello!", true);
            latch.await();
        }

        private static class WebSocketClient implements WebSocket.Listener {
            private final CountDownLatch latch;

            public WebSocketClient(CountDownLatch latch) { this.latch = latch; }

            @Override
            public void onOpen(WebSocket webSocket) {
                System.out.println("onOpen using subprotocol " + webSocket.getSubprotocol());
                WebSocket.Listener.super.onOpen(webSocket);
            }

            @Override
            public CompletionStage<?> onText(WebSocket webSocket, CharSequence data, boolean last) {
                System.out.println("onText received " + data);
                latch.countDown();
                return WebSocket.Listener.super.onText(webSocket, data, last);
            }

            @Override
            public void onError(WebSocket webSocket, Throwable error) {
                System.out.println("Bad day! " + webSocket.toString());
                WebSocket.Listener.super.onError(webSocket, error);
            }
        }
    }

Кстати, не было согласовано ни одного протокола, поэтому метод webSocket.getSubprotocol() возвращает пустую строку. Вывод в консоли

    onOpen using subprotocol 
    onText received Hello!
...