注册

【直播开发】Android 端实现 WebSocket 通信

前言


在之前的文章中,我们知道了 WebSocket 是一种全双工通信协议。本文将介绍如何在 Android 端使用 WebSocket 进行双向通信。其中包括创建 WebSocket 对象、发送和接收数据等操作。


创建 WebSocket 对象


要使用 WebSocket 对象,我们需要先创建一个 WebSocket 客户端对象。在 Android 中,我们可以使用 OkHttp 库来创建 WebSocket 客户端对象。在开始之前,我们先在 Gradle 文件中添加 OkHttp 库的依赖:


implementation 'com.squareup.okhttp3:okhttp:4.9.3'

在代码中创建 WebSocket 客户端对象的示例如下:


import okhttp3.OkHttpClient
import okhttp3.Request
import okhttp3.WebSocket

//创建一个 OkHttpClient 对象
val client = OkHttpClient()

//请求体
val request = Request.Builder()
.url("wss://example.com/websocket")
.build()

//通过上面的 client 创建 webSocket
val webSocket = client.newWebSocket(request, object : WebSocketListener() {
override fun onOpen(webSocket: WebSocket, response: Response) {
// WebSocket 连接建立成功
}

override fun onMessage(webSocket: WebSocket, text: String) {
// 收到 WebSocket 服务器发送的文本消息
}

override fun onMessage(webSocket: WebSocket, bytes: ByteString) {
// 收到 WebSocket 服务器发送的二进制消息
}

override fun onFailure(webSocket: WebSocket, t: Throwable, response: Response?) {
// WebSocket 连接失败
}

override fun onClosed(webSocket: WebSocket, code: Int, reason: String) {
// WebSocket 连接关闭
}
})

在上面的示例中,我们首先创建了一个 OkHttpClient 对象,然后使用 Request.Builder 类构建了一个 WebSocket 请求对象,并指定了 WebSocket 服务器的地址。接着,我们调用 OkHttpClient 对象的 newWebSocket() 方法,传入 WebSocket 请求对象和一个 WebSocketListener 对象,来创建一个 WebSocket 客户端对象。在 WebSocketListener 对象中,我们可以实现 WebSocket 连接建立、收到消息、连接失败、连接关闭等事件的回调函数。


发送和接收数据


WebSocket 客户端对象创建成功后,我们可以通过 send() 方法来向 WebSocket 服务器发送消息。在 WebSocketListener 对象中的 onMessage() 方法中,我们可以接收到 WebSocket 服务器发送的消息。下面是一个发送和接收文本消息的示例:


val message = "Hello, WebSocket!"

webSocket.send(message)

// 在 onMessage() 方法中接收消息
override fun onMessage(webSocket: WebSocket, text: String) {
Log.d(TAG, "Received message: $text")
}

如果要发送二进制消息,可以使用 send() 同名的另一个重载方法:


val message = ByteString.encodeUtf8("Hello, WebSocket!")

webSocket.send(message)

// 在 onMessage() 方法中接收消息
override fun onMessage(webSocket: WebSocket, bytes: ByteString) {
Log.d(TAG, "Received message: ${bytes.utf8()}")
}

关闭 WebSocket 连接


当 WebSocket 连接不再需要时,我们可以调用 WebSocket 对象的 close() 方法来关闭连接,及时释放资源,避免引起内存泄漏。在 WebSocketListener 对象中的 onclose() 方法中,我们可以接收到 WebSocket 关闭事件,可以在该事件中执行一些清理操作。下面是一个关闭 WebSocket 连接的示例:


webSocket.close(NORMAL_CLOSURE_STATUS, "WebSocket connection closed")

// 在 onClosed() 方法中接收关闭事件
override fun onClosed(webSocket: WebSocket, code: Int, reason: String) {
Log.d(TAG, "WebSocket connection closed: $reason")
}

在上面的示例中,我们调用 WebSocket 对象的 close() 方法来关闭连接,传入一个关闭代码和关闭原因。在 WebSocketListener 对象中的 onClosed() 方法中,我们可以接收到 WebSocket 关闭事件,并处理关闭原因。


完整示例


下面是一个完整的 WebSocket 通信示例,包括创建 WebSocket 对象、发送和接收消息、关闭连接等操作:


import android.os.Bundle
import android.util.Log
import androidx.appcompat.app.AppCompatActivity
import kotlinx.android.synthetic.main.activity_main.*
import okhttp3.*
import okio.ByteString

class MainActivity : AppCompatActivity() {

private lateinit var webSocket: WebSocket

companion object {
private const val TAG = "WebSocketDemo"
private const val NORMAL_CLOSURE_STATUS = 1000
}

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)

val client = OkHttpClient()

val request = Request.Builder()
.url("wss://echo.websocket.org")
.build()

webSocket = client.newWebSocket(request, object : WebSocketListener() {
override fun onOpen(webSocket: WebSocket, response: Response) {
webSocket.send("Hello, WebSocket!")
}

override fun onMessage(webSocket: WebSocket, text: String) {
Log.d(TAG, "Received message: $text")
}

override fun onMessage(webSocket: WebSocket, bytes: ByteString) {
Log.d(TAG, "Received message: ${bytes.utf8()}")
}

override fun onFailure(webSocket: WebSocket, t: Throwable, response: Response?) {
Log.e(TAG, "WebSocket connection failed", t)
}

override fun onClosed(webSocket: WebSocket, code: Int, reason: String) {
Log.d(TAG, "WebSocket connection closed: $reason")
}
})

btn_send.setOnClickListener {
val message = et_message.text.toString()
webSocket.send(message)
}

btn_close.setOnClickListener {
webSocket.close(NORMAL_CLOSURE_STATUS, "WebSocket connection closed")
}
}
}

在上面的示例中,我们在 Activity 的 onCreate() 方法中创建了 WebSocket 客户端对象,并通过按钮的点击事件来发送消息和关闭连接。我们使用了 Echo WebSocket 服务器来测试 WebSocket 通信。在实际开发中,我们可以使用自己的 WebSocket 服务器来进行通信。


总结


WebSocket 是一种全双工通信协议,可以在 Android 应用程序中使用 WebSocket 对象实现双向通信。通过 OkHttp 库,我们可以创建 WebSocket 客户端对象,使用 send() 方法发送消息,使用 WebSocketListener 回调接口处理事件。在实际应用中,我们可以使用 WebSocket 协议来实现实时交互、即时通信等功能,提升 Android 应用程序的用户体验和竞争力。


作者:Quincy_Ye
链接:https://juejin.cn/post/7224015103481200677
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

0 个评论

要回复文章请先登录注册