Android开发实战班 - 网络编程 - WebSocket 实时通信

在现代应用开发中,实时通信是许多应用的核心功能之一,例如聊天应用、实时通知、在线游戏等。WebSocket 是一种在单个 TCP 连接上进行全双工通信的协议,能够实现服务器与客户端之间的实时双向数据交换。相比于传统的 HTTP 请求,WebSocket 更加高效,适合实时数据传输。本章节将介绍 WebSocket 的基本概念、优势、在 Android 中的实现方式以及实战案例,帮助学员掌握 WebSocket 实时通信的实现。

20.1 WebSocket 简介

  • 什么是 WebSocket:

    • WebSocket 是一种在单个 TCP 连接上进行全双工通信的协议。
    • WebSocket 允许服务器主动向客户端推送数据,实现实时双向通信。
  • WebSocket 的特点:

    • 全双工通信: 服务器和客户端可以同时发送和接收数据。
    • 实时性: WebSocket 实现了真正的实时通信,适合实时数据传输。
    • 高效性: WebSocket 使用单个 TCP 连接,减少了 HTTP 请求的开销。
    • 支持跨域: WebSocket 支持跨域通信,可以在不同域名之间进行通信。
  • WebSocket 的使用场景:

    • 实时聊天应用
    • 实时通知
    • 在线游戏
    • 实时数据监控
    • 实时协作应用

20.2 WebSocket 与 HTTP 的比较

特性 WebSocket HTTP
连接方式 单个 TCP 连接,全双工通信 短连接,每次请求都需要重新建立连接
实时性 实时双向通信 请求-响应模式,非实时
效率 高效,减少连接开销 每次请求都需要重新建立连接,效率较低
数据格式 文本或二进制数据 文本数据(通常是 JSON, XML 等)
支持协议 WebSocket 协议 HTTP 协议
适用场景 实时通信 静态资源加载、数据查询等

20.3 WebSocket 在 Android 中的实现

在 Android 中,可以使用 OkHttp 提供的 WebSocket 支持来实现 WebSocket 通信。OkHttp 提供了简洁的 API,可以方便地创建 WebSocket 连接、发送消息、接收消息等。

20.3.1 添加 OkHttp 依赖

build.gradle 文件中添加 OkHttp 依赖:

groovy 复制代码
dependencies {
    implementation "com.squareup.okhttp3:okhttp:4.9.3"
}
20.3.2 创建 WebSocket 连接

使用 OkHttp 创建 WebSocket 连接,并处理连接、消息、关闭和错误事件。

kotlin 复制代码
import okhttp3.*
import okio.ByteString

class WebSocketManager {

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

    private val listener = object : WebSocketListener() {
        override fun onOpen(webSocket: WebSocket, response: Response) {
            super.onOpen(webSocket, response)
            println("WebSocket 连接已打开")
            // 发送消息
            webSocket.send("Hello, WebSocket!")
        }

        override fun onMessage(webSocket: WebSocket, text: String) {
            super.onMessage(webSocket, text)
            println("收到消息: $text")
        }

        override fun onMessage(webSocket: WebSocket, bytes: ByteString) {
            super.onMessage(webSocket, bytes)
            println("收到二进制消息: ${bytes.hex()}")
        }

        override fun onClosing(webSocket: WebSocket, code: Int, reason: String) {
            super.onClosing(webSocket, code, reason)
            println("WebSocket 连接正在关闭: $code, $reason")
            webSocket.close(1000, null)
        }

        override fun onFailure(webSocket: WebSocket, t: Throwable, response: Response?) {
            super.onFailure(webSocket, t, response)
            println("WebSocket 连接失败: ${t.message}")
        }
    }

    fun connect() {
        client.newWebSocket(request, listener)
    }

    fun sendMessage(message: String) {
        client.dispatcher.executorService.execute {
            client.webSocket(request, listener).send(message)
        }
    }

    fun close() {
        client.dispatcher.executorService.execute {
            client.close(1000, "Goodbye")
        }
    }
}
20.3.3 使用 WebSocket

在 Activity 或 Fragment 中使用 WebSocketManager 进行 WebSocket 连接、发送消息和关闭连接。

kotlin 复制代码
class WebSocketActivity : AppCompatActivity() {

    private lateinit var webSocketManager: WebSocketManager

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

        webSocketManager = WebSocketManager()
        webSocketManager.connect()

        findViewById<Button>(R.id.buttonSend).setOnClickListener {
            val message = findViewById<EditText>(R.id.editTextMessage).text.toString()
            webSocketManager.sendMessage(message)
        }

        findViewById<Button>(R.id.buttonClose).setOnClickListener {
            webSocketManager.close()
        }
    }

    override fun onDestroy() {
        super.onDestroy()
        webSocketManager.close()
    }
}

20.4 WebSocket 实战案例

  1. 案例一:使用 WebSocket 实现实时聊天应用

    • 使用 OkHttp 创建 WebSocket 连接。
    • 发送和接收消息。
    • 在 Activity 中显示聊天消息。
    kotlin 复制代码
    class ChatActivity : AppCompatActivity() {
    
        private lateinit var webSocketManager: WebSocketManager
        private lateinit var chatAdapter: ChatAdapter
    
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            setContentView(R.layout.activity_chat)
    
            chatAdapter = ChatAdapter()
            val recyclerView = findViewById<RecyclerView>(R.id.recyclerView)
            recyclerView.adapter = chatAdapter
            recyclerView.layoutManager = LinearLayoutManager(this)
    
            webSocketManager = WebSocketManager()
            webSocketManager.connect()
    
            webSocketManager.listener = object : WebSocketListener() {
                override fun onMessage(webSocket: WebSocket, text: String) {
                    super.onMessage(webSocket, text)
                    runOnUiThread {
                        chatAdapter.addMessage(text)
                        recyclerView.scrollToPosition(chatAdapter.itemCount - 1)
                    }
                }
            }
    
            findViewById<Button>(R.id.buttonSend).setOnClickListener {
                val message = findViewById<EditText>(R.id.editTextMessage).text.toString()
                webSocketManager.sendMessage(message)
                chatAdapter.addMessage(message)
                recyclerView.scrollToPosition(chatAdapter.itemCount - 1)
            }
        }
    
        override fun onDestroy() {
            super.onDestroy()
            webSocketManager.close()
        }
    }
  2. 案例二:使用 WebSocket 实现实时通知

    • 使用 OkHttp 创建 WebSocket 连接。
    • 接收服务器推送的实时通知。
    • 在通知栏显示通知。

20.5 课后作业

  1. 任务一:使用 WebSocket 实现实时聊天应用

    • 使用 OkHttp 创建 WebSocket 连接。
    • 发送和接收消息。
    • 在 Activity 中显示聊天消息。
  2. 任务二:使用 WebSocket 实现实时通知

    • 使用 OkHttp 创建 WebSocket 连接。
    • 接收服务器推送的实时通知。
    • 在通知栏显示通知。
相关推荐
SamChan9018 分钟前
PDF翻译API的JWT签名鉴权与速率限制设计:安全实战指南
网络·安全·pdf
心平气和量大福大23 分钟前
android-实例-蒲公英-更新与安装-5-签名与生成APK
android·java·开发语言
xiaoxiangsiyan1 小时前
HCIA 网络技术基础核心模块详解
运维·网络·网络协议·tcp/ip·运维开发·网络基础
AGCSDNl2 小时前
葛姓的来源
网络
阿pin2 小时前
Android随笔-Serializable与Parcelable
android·serializable·parcelable
天空之城--2 小时前
Android 事件分发机制深度解析——原理、源码与实战综合总结
android
阿pin3 小时前
Android随笔-AIDL
android·开发语言·aidl
漫路在线4 小时前
无境红日靶场五 wp
网络·安全·web安全
2501_916007474 小时前
Bundle ID 注册与管理 App ID 创建指南 命名规则 权限开关与删除注意事项
android·ios·小程序·https·uni-app·iphone·webview
雨白4 小时前
面向对象六大基本原则实战:从零重构支持引擎切换的网络框架
android·架构