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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

凉亭下

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值