public class WebSocketUtil {
private static final int NORMAL_CLOSURE_STATUS = 1000;
private final OkHttpClient client = new OkHttpClient();
private WebSocket socket;
private WebSocketListener listener;
private Map<String, WebSocket> webSockets = new ConcurrentHashMap<>();
public void connect(String url) {
Request request = new Request.Builder().url(url).build();
listener = new WebSocketListener() {
@Override
public void onOpen(WebSocket webSocket, Response response) {
}
@Override
public void onMessage(WebSocket webSocket, String text) {
// 接收到服务端发来的消息
Log.d("WebSocket", "onMessage: " + text);
}
@Override
public void onMessage(WebSocket webSocket, ByteString bytes) {
// 接收到服务端发来的消息
Log.d("WebSocket", "onMessage: " + bytes.toString());
}
@Override
public void onClosing(WebSocket webSocket, int code, String reason) {
webSocket.close(NORMAL_CLOSURE_STATUS, null);
}
@Override
public void onFailure(WebSocket webSocket, Throwable t, Response response) {
Log.e("WebSocket", "onFailure", t);
}
};
socket = client.newWebSocket(request, listener);
}
public void send(String message, String targetClientId) {
if (!TextUtils.isEmpty(targetClientId)) {
// 向指定客户端发送消息
WebSocket targetSocket = webSockets.get(targetClientId);
if (targetSocket != null) {
targetSocket.send(message);
}
} else {
// 向所有客户端发送消息
socket.send(message);
}
}
public void disconnect() {
if (socket != null) {
socket.close(NORMAL_CLOSURE_STATUS, null);
}
client.dispatcher().executorService().shutdown();
}
public void addWebSocket(String clientId, WebSocket webSocket) {
webSockets.put(clientId, webSocket);
}
public void removeWebSocket(String clientId) {
webSockets.remove(clientId);
}
}
在上面的代码中,我们在 WebSocketUtil
类中封装了几个方法,分别用于连接 WebSocket 服务器、向客户端发送消息、断开连接等。其中,我们使用了 ConcurrentHashMap 来存储多个客户端的 WebSocket 连接,以支持向特定客户端发送消息。
以下是一个使用示例:
// 连接 WebSocket 服务器
WebSocketUtil webSocketUtil = new WebSocketUtil();
webSocketUtil.connect("ws://10.0.0.2:8080");
// 发送消息
webSocketUtil.send("hello, world!", null); // 向所有客户端发送消息
String targetClientId = "abcde"; // 指定某个客户端
webSocketUtil.send("hello, client!", targetClientId); // 向特定客户端发送消息
// 在 WebSocket 连接中添加新的客户端
WebSocket ws = ... // 新的 WebSocket 连接
String clientId = "12345"; // 客户端的 ID
webSocketUtil.addWebSocket(clientId, ws);
// 从 WebSocket 连接中移除客户端
webSocketUtil.removeWebSocket(clientId);
// 断开 WebSocket 连接
webSocketUtil.disconnect();
在上面的代码中,我们首先调用 WebSocketUtil
中的 connect()
方法来连接 WebSocket 服务器。在连接成功后,我们可以使用 send()
方法向客户端发送消息,包括向所有客户端或向特定客户端发送。在服务端接收到消息时,会分别触发 onMessage()
回调,你可以在回调中处理接收到的消息。
此外,我们还实现了 addWebSocket()
方法和 removeWebSocket()
方法,以便在 WebSocket 连接中添加新的客户端并移除已连接的客户端,以满足客户端上下线的需求。
这个工具类能够支持 WebSocket 发送和接收各种类型的数据,例如 String、ByteString 等,你可以在 onMessage()
回调中对不同类型的数据进行不同的处理,以满足你的需求。