需要简单的纯 Java 11 WebSocket 客户端示例的帮助 [英] Require assistance with simple pure Java 11 WebSocket client example

查看:42
本文介绍了需要简单的纯 Java 11 WebSocket 客户端示例的帮助的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

网络上似乎很少有 Java 11(纯 Java 非框架)WebSocket 客户端 代码示例,所以我希望 StackOverflow 能再次帮助我.

这是我找到的最接近的,但不幸的是在我(新手)看来,它似乎不是展示如何使用来自 WebSocket 侦听器的数据的完整解决方案.

查看WebSocket.Listener 实现,我认为 onText 回调方法会提供我需要的东西,但我'我正在努力弄清楚如何从套接字返回 CompletionStage 对象和某种字符串数据.

这是我目前的一些测试代码.

希望得到帮助.谢谢

 public class Main {公共静态无效主(字符串 [] args){WebSocketClient wsc = new WebSocketClient();wsc.startSocket("ws://demos.kaazing.com/echo");int i = 0;//糟糕,非常糟糕做 {} while (i == 0);}}公共类 WebSocketClient 实现 WebSocket.Listener {@覆盖public void onOpen(WebSocket webSocket) {//...System.out.println("Go...Open".concat(webSocket.getSubprotocol()));}@覆盖公共 CompletionStage<?>onText(WebSocket webSocket,CharSequence 数据,最后一个布尔值){//...System.out.println(data.toString());//如何返回 CompletionStage 对象//返回 CompletionStage}@覆盖public void onError(WebSocket webSocket, Throwable error) {//..System.out.println("糟糕的一天!".concat(webSocket.toString()));}void startSocket(字符串连接){CompletableFutureserver_cf = HttpClient.newHttpClient().newWebSocketBuilder().buildAsync(URI.create(connection),新的 WebSocketClient());WebSocket 服务器 = server_cf.join();server.sendText("你好!", true);}}

解决方案

下面是一个工作示例.我对上面的代码进行了一些更改:

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

但除此之外,程序会遵循您的想法,即首先构建 websocket 连接,成功构建后,文本 Hello! 被发送到回显服务器.这也可以直接在方法 onOpen 中完成.

 import java.net.URI;导入 java.net.http.HttpClient;导入 java.net.http.WebSocket;导入 java.util.concurrent.CompletionStage;导入 java.util.concurrent.CountDownLatch;公共课主要{public static void main(String[] args) 抛出异常 {CountDownLatch 锁存器 = 新 CountDownLatch(1);WebSocket ws = HttpClient.newHttpClient().newWebSocketBuilder().buildAsync(URI.create("ws://demos.kaazing.com/echo"), new WebSocketClient(latch)).加入();ws.sendText("你好!", true);闩锁.等待();}私有静态类 WebSocketClient 实现 WebSocket.Listener {私有最终 CountDownLatch 锁存器;公共 WebSocketClient(CountDownLatch 闩锁){ this.latch = 闩锁;}@覆盖public void onOpen(WebSocket webSocket) {System.out.println("onOpen using subprotocol " + webSocket.getSubprotocol());WebSocket.Listener.super.onOpen(webSocket);}@覆盖公共 CompletionStage<?>onText(WebSocket webSocket,CharSequence 数据,最后一个布尔值){System.out.println("onText 收到" + 数据);闩锁.countDown();返回 WebSocket.Listener.super.onText(webSocket, data, last);}@覆盖public void onError(WebSocket webSocket, Throwable error) {System.out.println("糟糕的一天!" + webSocket.toString());WebSocket.Listener.super.onError(webSocket, error);}}}

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

 onOpen 使用子协议onText 收到 您好!

There appears to be very little Java 11 (pure Java non framework based) WebSocket client code examples on the web so I'm hoping StackOverflow can come to the rescue for me once again.

This is the closest I've found, but unfortunately to my (novice) eyes, it doesn't appear to be a complete solution in showing how to consume the data from the WebSocket listener.

Looking at the WebSocket.Listener implementation, the onText callback method I presume would provide what I need, but I'm struggling to figure out how to return the CompletionStage object and some sort of string data from the socket.

This is some test code I have so far.

Would appreciate assistance. Thanks

    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);
        }
    }

解决方案

Below you find a working example. I have made some changes to your code above:

  • onOpen needs to invoke request(1) on the websocket (invoking the default implementation) in order to receive further invocations.
  • moved method startSocket into the main method
  • replaced busy waiting with a count down latch
  • declared class WebSocketClient as a (static) inner class

but beyond these (cosmetic) changes the program follows your idea, i.e. first a websocket connection is build and after successful construction the text Hello! is sent to the echo server. This could also be done in method onOpen directly.

    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);
            }
        }
    }

Btw, no supprotocol was negotiated, therefore method webSocket.getSubprotocol() returns an empty string. The output in the console is

    onOpen using subprotocol 
    onText received Hello!

这篇关于需要简单的纯 Java 11 WebSocket 客户端示例的帮助的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆