IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 网络协议 -> 一篇文章带你看懂WebSocket的使用 -> 正文阅读

[网络协议]一篇文章带你看懂WebSocket的使用


前言

本篇文章讲述的是WebSocket在Android中的应用,为还不会使用WebSocket的小伙伴提供一点思路,希望能帮助到大家!!!

一、WebSocket是什么?

测试网站:https://www.websocket.org/echo.html

二、使用步骤

1.引入库

//java-websocket的依赖
implementation "org.java-websocket:Java-WebSocket:1.4.0"

2.创建JavaWebClientService用来连接服务器

01.覆写父类的方法

class JWebSocketClientService : Service() {

    var client: JWebsocketClient?= null
    private val mBinder = InnerIBinder()

    override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
        //初始化websocket
        initSocketClient()
        //开启心跳检测
        mHandler.postDelayed(heartBeatRunnable, HEART_BEAT_RATE)
        return super.onStartCommand(intent, flags, startId)
    }
    
    //返回Binder对象
    override fun onBind(intent: Intent?): IBinder = mBinder
    
    override fun onDestroy() {
        closeConnect()
        super.onDestroy()
    }
    ...

02.初始化WebSocketClient,定义连接、发送消息、断开连接的方法

    //初始化
    private fun initSocketClient() {
        val uri = URI.create("ws://echo.websocket.org")
        //创建JWebsocketClient实例
        client = object : JWebsocketClient(uri) {
            override fun onMessage(message: String?) {
                Log.d("hy55", "收到的消息:$message")
                val intent = Intent()
                intent.action = "CCTV5"
                intent.putExtra("message", message)
                sendBroadcast(intent)
            }
        }
        connect()
    }

    fun sendMsg(msg: String) {
        client!!.send(msg)
    }


    private fun connect() {
        object : Thread() {
            override fun run() {
                try {
                    //connectBlocking多出一个等待操作,会先连接再发送,否则未连接发送会报错
                    client?.connectBlocking()
                } catch (e: InterruptedException) {
                    e.printStackTrace()
                }
            }
        }.start()   //这里不要忘了start()开启线程
    }

    fun closeConnect() {
        try {
            client?.close()
        } catch (e: Exception) {
            e.printStackTrace()
        } finally {
            client = null
        }
    }

03.定义心跳检测的方法

    //websocket心跳检测
    private val HEART_BEAT_RATE: Long = 10 * 1000 //每隔10秒进行一次对长连接的心跳检测
    private val mHandler = Handler()
    private val heartBeatRunnable = object : Runnable {
        override fun run() {
            Log.i("JWebSocketClientService", "心跳包检测websocket连接状态")
            if (client != null) {
                if (client!!.isClosed) {
                    reconnectWs()
                }
            } else {
                initSocketClient()
            }
            //每隔一定的时间,对长连接进行一次心跳检测
            mHandler.postDelayed(this, HEART_BEAT_RATE)
        }

    }

    private fun reconnectWs() {
        mHandler.removeCallbacks(heartBeatRunnable)
        object : Thread() {
            override fun run() {
                try {
                    Log.e("JWebSocketClientService", "开启重连")
                    client!!.reconnectBlocking()
                } catch (e: InterruptedException) {
                    e.printStackTrace()
                }
            }
        }.start()
    }

    inner class InnerIBinder : Binder() {
        fun getService(): JWebSocketClientService = this@JWebSocketClientService
    }

3.创建JavaWebClient

//创建Java-Websocket的客户端,继承WebSocketClient,覆写父类的方法
abstract class JWebsocketClient(serverUri: URI) : WebSocketClient(serverUri) {

    override fun onOpen(handshakedata: ServerHandshake?) {
        Log.i("JWebSocketClient", "onOpen()")
    }

    override fun onMessage(message: String?) {
        Log.i("JWebSocketClient", "onMessage()")
    }

    override fun onClose(code: Int, reason: String?, remote: Boolean) {
        Log.i("JWebSocketClient", "onClose()")
    }

    override fun onError(ex: Exception?) {
        Log.i("JWebSocketClient", "onError()")
    }
    
}

4.使用WebSocketClientService和WebsocketClient

01.启动Service、绑定Service、注册广播

class MainActivity : AppCompatActivity() {

    private lateinit var tv_message: TextView
    private var client: JWebsocketClient? = null
    private val serviceConnection = InnerServiceConnection()
    private var binder: JWebSocketClientService.InnerIBinder? = null
    private var jWebSClientService: JWebSocketClientService? = null
    private var chatMessageReceiver: ChatMessageReceiver? = null

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        val et_message = findViewById<EditText>(R.id.et_message)
        val btn_send = findViewById<Button>(R.id.btn_send)
        tv_message = findViewById(R.id.tv_message)
        //启动service
        startJWebSClientService()
        //绑定服务
        bindService()
        //注册广播
        doRegisterReceiver()
        btn_send.setOnClickListener{
            if (client != null && client!!.isOpen) {

                Log.d("hy55", "${et_message.text}")
                //发送消息
                jWebSClientService!!.sendMsg(et_message?.text.toString())
            }
        }
    }

02.启动Service、绑定Service、注册广播的具体实现

    private fun startJWebSClientService() {
        val intent = Intent(this, JWebSocketClientService::class.java)
        startService(intent)
    }

    private fun bindService() {
        val bindIntent = Intent(this, JWebSocketClientService::class.java)
        bindService(bindIntent, serviceConnection, BIND_AUTO_CREATE)
    }

    inner class InnerServiceConnection : ServiceConnection {
        override fun onServiceConnected(name: ComponentName, service: IBinder) {
            Log.d("Service", "onServiceConnected()->当Activity和Service连接")
            binder = service as JWebSocketClientService.InnerIBinder
            jWebSClientService = binder!!.getService()
            client = jWebSClientService!!.client
        }

        override fun onServiceDisconnected(name: ComponentName) {
            Log.d("Service", "onServiceConnected()->当Activity和Service断开连接")
        }
    }

03.定义广播类以及注册广播类

    inner class ChatMessageReceiver : BroadcastReceiver() {
        //接收消息的地方
        override fun onReceive(context: Context, intent: Intent) {
            val message = intent.getStringExtra("message")
            tv_message.append(message)
        }
    }

    private fun doRegisterReceiver() {
        chatMessageReceiver = ChatMessageReceiver()
        val filter = IntentFilter("CCTV5")
        registerReceiver(chatMessageReceiver, filter)
    }

总结

这篇文章是对WebSocket简单使用的介绍,但万变不离其宗,所有复杂的应用都是基于最简单的原理!!!

  网络协议 最新文章
使用Easyswoole 搭建简单的Websoket服务
常见的数据通信方式有哪些?
Openssl 1024bit RSA算法---公私钥获取和处
HTTPS协议的密钥交换流程
《小白WEB安全入门》03. 漏洞篇
HttpRunner4.x 安装与使用
2021-07-04
手写RPC学习笔记
K8S高可用版本部署
mySQL计算IP地址范围
上一篇文章      下一篇文章      查看所有文章
加:2021-08-17 15:45:03  更:2021-08-17 15:46:48 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 19:53:15-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码