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)
在下面,您可以找到一个有效的示例。我对您的上面的代码做了一些更改:
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)
| 归档时间: |
|
| 查看次数: |
932 次 |
| 最近记录: |