Android使用okHttp实现WebSocket源码分析

本文探讨了在Android项目中如何利用okHttp实现WebSocket以达到长连接的效果,避免频繁HTTP请求带来的流量浪费。详细分析了WebSocket的协议特点,如双向通信、Upgrade头部信息和101响应码。接着,介绍了使用okHttp封装WebSocket的源码过程,包括懒汉式单例、连接方法、请求头设置、握手过程、连接校验、数据传输以及读取服务器消息的机制。最后,作者希望读者能从中受益,并欢迎大家指正错误。
摘要由CSDN通过智能技术生成

项目中需要实现一个类似心跳包的内容,语音通话期间,需要不断的请求服务器发送数据,确保正在连接中,开始想到的是使用service开启子线程,定时请求接口发送数据,但数据量很大时,http请求头部太大,每次请求需要发送重复的头数据,非常消耗流量,于是考虑使用长连接的方式。Android中实现WebSocket有很多种方式,这里说一下okHttp的方式。先来大致了解一下websocket。

  • WebSocket属于双向通信协议,Http是单向的
  • webSocket是需要握手进行建立连接的,只是在建立握手时,数据是通过HTTP传输的,但建立之后传输数据不需要http协议
  • websocket的请求链接不是http://这种,而是以ws://开头
  • websocket的Connection链接类型是 Upgrade:websocket,表示将该请求升级为websocket。
  • websocket的头部响应码是101,表示本次链接的http协议即将被更改为upgrade:websocket 指定的协议。

使用okhttp封装websocketdemo

public class WebSocketDemo {

    private final String TAG = WebSocketDemo.class.getSimpleName();

    private OkHttpClient CLIENT;
    private WebSocket mWebSocket;

    private static WebSocketDemo ourInstance;

    public static WebSocketDemo getDefault() {
        if (ourInstance == null) {
            synchronized (WebSocketDemo.class) {
                if (ourInstance == null) {
                    ourInstance = new WebSocketDemo();
                }
            }
        }
        return ourInstance;
    }

    private WebSocketDemo() {
        CLIENT = new OkHttpClient.Builder()
                .writeTimeout(5, TimeUnit.SECONDS)
                .readTimeout(5, TimeUnit.SECONDS)
                .connectTimeout(5, TimeUnit.SECONDS)
                .build();
    }

    public void connect(String url) {
        if (mWebSocket != null) {
            mWebSocket.cancel();
        }
        Request request = new Request.Builder()
                .url(url)
                .build();
        mWebSocket = CLIENT.newWebSocket(request, new SocketListener());
    }

    public void sendMessage(String message) {
        mWebSocket.send(message);
    }

    public void sendMes
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值