在简单的纯Java 11 WebSocket客户端示例中需要帮助

eod*_*uga 4 websocket java-http-client java-11

网上似乎很少有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);
        }
    }
Run Code Online (Sandbox Code Playgroud)

Dom*_*nik 5

在下面,您可以找到一个有效的示例。我对您的上面的代码做了一些更改:

  • onOpen需要request(1)在websocket上调用(调用默认实现),以接收进一步的调用。
  • 将方法startSocket移入主要方法
  • 用倒计时闩锁代替忙碌的等待
  • 声明的类WebSocketClient为(静态)内部类

但是除了这些(外观)更改之外,该程序还遵循您的想法,即,首先建立一个websocket连接,然后在成功构建之后输入文本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);
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

顺便说一句,没有协商任何协议,因此方法webSocket.getSubprotocol()返回一个空字符串。控制台中的输出是

    onOpen using subprotocol 
    onText received Hello!
Run Code Online (Sandbox Code Playgroud)