Java网络编程与API弃用:原理、实践与问题解决
立即解锁
发布时间: 2025-08-18 02:22:47 阅读量: 2 订阅数: 8 

### Java网络编程与API弃用:原理、实践与问题解决
#### 1. WebSocket客户端端点构建
要构建一个作为客户端端点的`WebSocket`接口实例,此实例用于与服务器端点建立连接并交换消息。可以通过`HttpClient`类的`newWebSocketBuilder(URI uri, WebSocket.Listener listener)`方法获取一个`WebSocket.Builder`来构建`WebSocket`实例。其中,`HttpClient`实例提供`WebSocket`的连接配置,`uri`是服务器端点的URI,`listener`则是为正在构建的端点指定的监听器。
构建端点时,可使用`WebSocket.Builder`的以下方法进行配置:
- `WebSocket.Builder connectTimeout(Duration timeout)`:指定打开握手的超时时间。若在指定时间内握手未完成,`buildAsync()`方法返回的`CompletableFuture`将以`HttpTimeoutException`异常完成。
- `WebSocket.Builder header(String name, String value)`:为打开握手添加自定义头信息。
- `WebSocket.Builder subprotocols(String mostPreferred, String... lesserPreferred)`:在打开握手时指定对给定子协议的请求,服务器将选择其中一个。
最后,调用`WebSocket.Builder`接口的`buildAsync()`方法构建端点,它返回`CompletableFuture<WebSocket>`,当端点成功连接到服务器端点时正常完成,出现错误时异常完成。示例代码如下:
```java
URI serverUri = new URI("ws://localhost:8080/webapp/servertime");
// Get a listener
WebSocket.Listener listener = ...;
// Build an endpoint using the default HttpClient
HttpClient.newHttpClient()
.newWebSocketBuilder(serverUri, listener)
.buildAsync()
.whenComplete((WebSocket webSocket, Throwable t) -> {
// More code goes here
});
```
#### 2. 向对等方发送消息
客户端端点连接到对等方后,双方开始交换消息。`WebSocket`接口实例代表客户端端点,该接口包含以下用于向对等方发送消息的方法:
- `CompletableFuture<WebSocket> sendBinary(ByteBuffer message, boolean isLast)`:发送二进制消息。
- `CompletableFuture<WebSocket> sendClose()`:发送关闭消息。
- `CompletableFuture<WebSocket> sendClose(int statusCode, String reason)`:发送带状态码和原因的关闭消息。
- `CompletableFuture<WebSocket> sendPing(ByteBuffer message)`:发送Ping消息。
- `CompletableFuture<WebSocket> sendPong(ByteBuffer message)`:发送Pong消息。
- `CompletableFuture<WebSocket> sendText(CharSequence message)`:发送文本消息。
- `CompletableFuture<WebSocket> sendText(CharSequence message, boolean isLast)`:发送部分或完整的文本消息。
若要突然关闭`WebSocket`,可使用`WebSocket`接口的`abort()`方法。
#### 3. 运行WebSocket程序
下面是一个封装了客户端端点及其操作的`WebSocketClient`类:
```java
// WebSocketClient.java
package com.jdojo.http.client;
import java.net.URI;
import java.util.concurrent.CompletionStage;
import jdk.incubator.http.HttpClient;
import jdk.incubator.http.WebSocket;
public class WebSocketClient {
private WebSocket webSocket;
private final URI serverUri;
private boolean inError = false;
public WebSocketClient(URI serverUri) {
this.serverUri = serverUri;
}
public boolean isClosed() {
return (webSocket != null && webSocket.isClosed())
||
this.inError;
}
public void connect() {
HttpClient.newHttpClient()
.newWebSocketBuilder(serverUri, this.getListener())
.buildAsync()
.whenComplete(this::statusChanged);
}
private void statusChanged(WebSocket webSocket, Throwable t) {
this.webSocket = webSocket;
if (t == null) {
this.talkToServer();
} else {
this.inError = true;
System.out.println("Could not connect to the server." +
" Error: " + t.getMessage());
}
}
private void talkToServer() {
// Allow one message to be received by the listener
webSocket.request(1);
// Send the server a request for time
webSocket.sendText("Hello");
}
private WebSocket.Listener getListener() {
return new WebSocket.Listener() {
@Override
public void onOpen(WebSocket webSocket) {
// Allow one more message to be received by the listener
webSocket.request(1);
// Notify the user that we are connected
System.out.println("A WebSocket has
```
0
0
复制全文
相关推荐









