Android中okhttp的websocket的详细使用方法(加断线重连)

这篇具有很好参考价值的文章主要介绍了Android中okhttp的websocket的详细使用方法(加断线重连)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

介绍之类的就不多讲了,懒得讲也未必有别人整理的清晰,直接上代码

	//okhttp-websocket
    implementation 'com.squareup.okhttp3:mockwebserver:3.8.1'

使用:文章来源地址https://www.toymoban.com/news/detail-607859.html

	private WebSocket mWebSocket;
    private OkHttpClient mClient;
    private boolean isReceivePong;
    private Animation operatingAnim;

    /**
     * WS初始化
     * */
    public void WSinit() {
        //连接前等待动画
        operatingAnim = AnimationUtils.loadAnimation(this, R.anim.waiting);
        LinearInterpolator lin = new LinearInterpolator();
        operatingAnim.setInterpolator(lin);
        mClient = new OkHttpClient.Builder()
                .pingInterval(10, TimeUnit.SECONDS)
                .build();
        WSConnect();

    }

    /**
     * WS连接
     * */
    public void WSConnect() {
        //关闭心跳发送,避免心跳重复
        heartHandler.removeCallbacksAndMessages(null);
        //开启前等待动画
        if (operatingAnim != null) {
            imgWebsocketStatus.setImageResource(R.drawable.waiting);
            imgWebsocketStatus.startAnimation(operatingAnim);
        }
        Request request = new Request.Builder()
                .url("ws://192.168.30.100:8044")
                .build();
        mWebSocket = mClient.newWebSocket(request, new WsListener());
    }

    /**
     * 回调
     * */
    class WsListener extends WebSocketListener {
        @Override
        public void onClosed(WebSocket webSocket, int code, String reason) {
            super.onClosed(webSocket, code, reason);
            //连接关闭...
            LogUtils.tag(TAG).e("WS连接关闭!"+code+reason);
        }

        @Override
        public void onClosing(WebSocket webSocket, int code, String reason) {
            super.onClosing(webSocket, code, reason);
            //客户端主动关闭时回调
            LogUtils.tag(TAG).e("连接中!" + code);
        }

        @Override
        public void onFailure(WebSocket webSocket, Throwable t, @Nullable Response response) {
            super.onFailure(webSocket, t, response);
            // 出错了
            Message message = new Message();
            message.what = 401;
            mHandler.sendMessage(message);
            LogUtils.tag(TAG).e("WS连接错误!错误信息:" + t.getMessage());
        }

        @Override
        public void onMessage(WebSocket webSocket, String text) {
            super.onMessage(webSocket, text);
            // 收到服务端发送来的 String 类型消息
            if (text.equals("Heartbeat")){
                isReceivePong = true;
                Log.e(TAG,"WS收到心跳,Pong="+isReceivePong);
            }else {
                LogUtils.tag(TAG).e("WS收到消息:" + text);
                Message message = new Message();
                message.what = 0;
                message.obj = text;
                mHandler.sendMessage(message);
            }
        }

        @Override
        public void onMessage(WebSocket webSocket, ByteString bytes) {
            super.onMessage(webSocket, bytes);
            //收到消息...(一般很少这种消息)
        }

        @Override
        public void onOpen(WebSocket webSocket, Response response) {
            super.onOpen(webSocket, response);
            //连接成功...
            //主动发送心跳包
            isReceivePong = true;
            //开启心跳
            heartHandler.sendEmptyMessage(10);
            //连接成功后关闭等待动画
            Message message = new Message();
            message.what = 400;
            mHandler.sendMessage(message);
            mWebSocket = webSocket;
            //测试发消息
            send("Heartbeat");
        }
    }

    /**
     * WS发送心跳包
     * */
    Handler heartHandler = new Handler(Looper.getMainLooper(), new Handler.Callback() {
        @Override
        public boolean handleMessage(Message msg) {
            if (msg.what != 10) return false;
            Log.e(TAG,"WS轮询时,Pong="+isReceivePong);
            if (isReceivePong) {
                send("Heartbeat");
                //isReceivePong置false,等待服务器返回心跳时置ture,如果服务器没有返回则表示连接断开
                isReceivePong = false;
                heartHandler.sendEmptyMessageDelayed(10, 10000);
            } else {
                Log.e(TAG,"关闭重连");
                //没有收到pong命令,进行重连
                WSConnect();
            }
            return false;
        }
    });

    /**
     * WS发送消息
     *
     * @param message
     */
    public void send(final String message) {
        if (mWebSocket != null) {
            if (!message.equals("Heartbeat")){
                LogUtils.tag(TAG).e("WS发送消息:" + message);
            }
            mWebSocket.send(message);
        }
    }

    /**
     * WS主动断开连接
     *
     * @param code
     * @param reason
     */
    public void disconnect(int code, String reason) {
        if (mWebSocket != null)
            mWebSocket.close(code, reason);
    }

到了这里,关于Android中okhttp的websocket的详细使用方法(加断线重连)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 轻松掌握 WebSocket API 的使用方法

    WebSocket API 是 HTML5 标准化之后的一项 API,它可用于建立客户端和服务器之间的双向通信连接。 WebSocket 构造函数 用于创建并返回一个 WebSocket 对象。 示例: WebSocket.readyState 表示 WebSocket 连接的状态。 示例: WebSocket.bufferedAmount 用于获取 WebSocket 对象在发送缓冲区中的字节数。

    2024年02月02日
    浏览(39)
  • uniapp使用WebSocket断线,心跳重连机制

    提示:我们在使用WebSocket,经常会遇到有的时候给别人发消息,别人会接收不到,这个时候就有可能是WebSocket断线了,所以这个时候心跳包就出现了 提示:可直接使用,记得把对应地址替换一下

    2024年04月12日
    浏览(42)
  • Unity中使用WebSocket (ws://)的方法

    WebSocket使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据。在WebSocket API中,浏览器和服务器只需要完成一次握手,两者之间就直接可以创建持久性的连接,并进行双向数据传输。 其实从历史上来讲,websocket是为了克服http无法双向通信而引

    2024年02月09日
    浏览(50)
  • 即时通信的方法和webSocket的具体使用

    之前遇到过需要即时通讯的场景,刚开始使用的是通过轮询的方式,定时器3秒向服务器请求一次数据,后面发现如果在手机端长时间打开使用此功能的页面,可能会发生手机发热,甚至卡顿的现象。最后改用webSocket,可以实现全双工通信,让服务器主动向客户端发送请求。

    2024年02月15日
    浏览(35)
  • Python-Websocket的介绍及使用方法

    👏👏👏 哈喽!大家好,我是【太阳打伞】,一位热爱分享各种技术的博主!😍😍😍 ⭐【太阳打伞】的创作宗旨:每一条命令都亲自执行过,每一行代码都实际运行过,每一种方法都真实实践过,每一篇文章都良心制作过。✊✊✊ ⭐【太阳打伞】的博客中所有涉及命令、

    2023年04月15日
    浏览(36)
  • SpringBoot集成websocket(4)|(使用okhttp3实现websocket)

    章节 第一章链接: SpringBoot集成websocket(1)|(websocket客户端实现) 第二章链接: SpringBoot集成websocket(2)|(websocket服务端实现以及websocket中转实现) HTTP是现代应用常用的一种交换数据和媒体的网络方式,高效地使用HTTP能让资源加载更快,节省带宽。OkHttp是一个高效的HTTP客户

    2024年02月10日
    浏览(42)
  • Unity3D WebGL平台使用WebSocket通信的方法和示例

          之前在WebGL平台和服务端交互的时候使用的是UnityWebRequest,通过WebAPI的方式进行交互,后来发现可以用WebSocket交互后就果断换了WebSocket。 一、Unity3D客户端 我在Unity端使用的是 NativeWebSocket NativeWebSocket下载地址 直接导入Unity即可, 下面是适配的代码,直接挂载在GameObject。

    2024年02月11日
    浏览(48)
  • Unity使用webSocket与服务器通信(二)——C#服务器端使用Fleck时的简单服用方法

    C#服务端用到Fleck包,它包含哪些可用的回调函数,有哪些常用的api方法? 演示:服务端收到Unity用户发来的信息 Fleck提供的回调函数有下面几种: 其它常用的api主要有: ping pong的作用是啥? WebSocket为了保持客户端、服务端的实时双向通信,需要确保客户端、服务端之间的

    2024年02月08日
    浏览(46)
  • websocket实时通讯和socket.io实时通信库的使用;心跳机制与断线重连

    https://zh.javascript.info/websocket WebSocket 是一种网络通信协议,就类似于 HTTP 也是一种通信协议。 为什么需要 WebSocket? 因为 HTTP 协议有一个缺陷:通信只能由客户端发起。 代码解析: 创建WebSocket实例:通过 new WebSocket() 创建一个WebSocket实例。在括号中传入服务器的URL,该URL指定了

    2024年02月16日
    浏览(42)
  • [Android]网络框架之OkHttp(详细)(kotlin)

    目录 OkHttp的介绍 添加依赖 OkHttp的使用 get的同步与异步请求 post的同步与异步请求 POST请求的数据格式 POST请求上传文件 POST请求上传json对象 POST请求上传多个数据 OkHttp的配置 1.Builder构建器 2.自定义拦截器 3.自定义缓存 4. 自定义Cookie https://square.github.io/okhttp/ 由Square公司贡献的

    2024年02月12日
    浏览(84)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包