gpt4 book ai didi

websocket - 需要有关简单的纯 Java 11 WebSocket 客户端示例的帮助

转载 作者:行者123 更新时间:2023-12-02 23:31:20 26 4
gpt4 key购买 nike

网络上似乎很少有 Java 11(纯 Java 非框架)WebSocket 客户端代码示例,因此我希望 StackOverflow 能够再次为我提供帮助。

This是我发现的最接近的,但不幸的是,在我(新手)看来,它似乎不是一个完整的解决方案,展示了如何使用 WebSocket 监听器中的数据。

查看WebSocket.Listener implementation, the 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);
}
}

最佳答案

下面是一个有效的示例。我对上面的代码做了一些更改:

  • onOpen 需要在 Websocket 上调用 request(1)(调用默认实现)才能接收进一步的调用。
  • 将方法 startSocket 移至 main 方法
  • 用倒计时锁存器取代忙等待
  • 将类 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);
}
}
}

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

    onOpen using subprotocol 
onText received Hello!

关于websocket - 需要有关简单的纯 Java 11 WebSocket 客户端示例的帮助,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55380813/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com