Android利用websocket协议与服务器通信——Java-WebSocket框架的实现

本文详细介绍了如何在Android中使用Java-WebSocket框架实现WebSocket通信,包括WebSocket的基本概念,框架的添加,建立连接,发送消息,重连机制,心跳机制,以及关闭连接的方法。同时,还探讨了WebSocket断开的可能原因和状态码。
摘要由CSDN通过智能技术生成

一、什么是WebSocket

WebSocket是一种在单个TCP连接上进行全双工通信的协议。它使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据。在WebSocket API中,客户端和服务器只需要完成一次握手,两者之间就直接可以创建持久性的连接,并进行双向数据传输。

二、如何使用WebSocket

android本身没有websocket的库,一般使用第三方框架实现,如Java-WebSocket、okhttp等。

三、Java-WebSocket框架的使用

GitHub地址:https://github.com/TooTallNate/Java-WebSocket

1. build.gradle中加入

implementation "org.java-websocket:Java-WebSocket:1.4.0"

2. 加入网络请求权限

<uses-permission android:name="android.permission.INTERNET" />

3. 新建客户端类

新建一个客户端类并继承WebSocketClient,需要实现它的四个抽象方法和构造函数,如下:

open class JWebSocketClient(serverUri: URI?) : WebSocketClient(serverUri, Draft_6455()) {
   
    override fun onOpen(handshakedata: ServerHandshake?) {
   
        Log.e("JWebSocketClient", "==连接成功==")
    }

    override fun onMessage(message: String) {
   
		Log.i("JWebSocketClient", "onMessage:$message")
    }
    override fun onClose(code: Int, reason: String?, remote: Boolean) {
   
        Log.e("JWebSocketClient", "==WebSocket关闭=== code:$code===== reason: $reason==== wasClean: $remote")
    }

    override fun onError(ex: Exception?) {
   
        ex?.printStackTrace()
        Log.e("JWebSocketClient", "==连接失败==")
    }
}

其中
onOpen()方法在websocket连接开启时调用,
onMessage()方法在接收到消息时调用,
onClose()方法在连接断开时调用,
onError()方法在连接出错时调用。
构造方法中的new Draft_6455()代表使用的协议版本,这里可以不写或者写成这样即可。

4. 建立websocket连接

建立连接只需要初始化此客户端再调用连接方法,需要注意的是WebSocketClient对象是不能重复使用的,所以不能重复初始化,其他地方只能调用当前这个Client。

//websocket协议地址大致是这样的: ws:// ip地址 : 端口号
val uri: URI = URI.create("ws://*******")
client = object : JWebSocketClient(uri) {
	override fun onMessage(message: String) {
    	super.onMessage(message)
		//message就是接收到的消息
        Log.e("JWebSClientService", message)
    }
}


try {
    client?.connectBlocking()
} catch (e: InterruptedException) {
    e.printStackTrace()
}

连接时可以使用connect()方法或connectBlocking()方法,建议使用connectBlocking()方法,connectBlocking多出一个等待操作,会先连接再发送。

5. 发送消息

发送消息只需要调用send()方法,如下

if (client?.isOpen == true) {
   
    client?.send("你好")
}

6. 重连

client.reconnectBlocking()

1、重连机制:

(1)监听网络连接, 当从断开到连上就可以调用重连
(2)在client回调的onError和onClose中调用重连

2、心跳机制:

写一个定时线程, 隔20秒就发送一个心跳:client.sendPing(), 这时候onWebsocketPong()会回调一次,这就是一次心跳

3、后端传回来的消息在onMessage中返回来, 我们可以跟后台定格式,哪些业务需要处理什么格式的数据,然后根据type来分发给业务。

7. 关闭socket连接

关闭连接调用close()方法,最后为了避免重复实例化WebSocketClient对象,关闭时一定要将对象置空。

/**
 * 断开连接
 */
fun closeConnect() {
   
    
  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值