需要简单的纯 Java 11 WebSocket 客户端示例的帮助 [英] Require assistance with simple pure Java 11 WebSocket client example
问题描述
网络上似乎很少有 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 invokerequest(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屋!