如何使用 OkHttp3 实现 Android 的 WebSocket 多客户端通信

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() 回调中对不同类型的数据进行不同的处理,以满足你的需求。

你可能感兴趣的:(Android,Socket,android,websocket,java)