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

embedded/2024/11/21 12:22:53/

在现代应用开发中,实时通信是许多应用的核心功能之一,例如聊天应用、实时通知、在线游戏等。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 的比较

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

20.3 WebSocket 在 Android 中的实现

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

20.3.1 添加 OkHttp 依赖

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

dependencies {implementation "com.squareup.okhttp3:okhttp:4.9.3"
}
20.3.2 创建 WebSocket 连接

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

import okhttp3.*
import okio.ByteStringclass 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 连接、发送消息和关闭连接。

class WebSocketActivity : AppCompatActivity() {private lateinit var webSocketManager: WebSocketManageroverride 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 中显示聊天消息。
    class ChatActivity : AppCompatActivity() {private lateinit var webSocketManager: WebSocketManagerprivate lateinit var chatAdapter: ChatAdapteroverride fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.activity_chat)chatAdapter = ChatAdapter()val recyclerView = findViewById<RecyclerView>(R.id.recyclerView)recyclerView.adapter = chatAdapterrecyclerView.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 连接。
    • 接收服务器推送的实时通知。
    • 在通知栏显示通知。

http://www.ppmy.cn/embedded/139333.html

相关文章

【iOS】iOS的轻量级数据库——FMDB

文章目录 前言FMDB一、特点二、关于SQLite什么是 SQLite&#xff1f; 三、FMDB库的导入四、FMDB库的使用1. 核心类2.使用步骤 总结 前言 在完成知乎日报仿写项目时&#xff0c;在文章详情页进行点赞和收藏&#xff0c;在个人账号页面的收藏里需要展现出来&#xff0c;这里使用到…

机器学习-02HMM模型学习

首先可以从视频有一个直观的理解&#xff0c;直接上公式会让人云里雾里&#xff0c;看完如下视频后&#xff0c;对于隐马尔可夫模型有直观理解&#xff0c;再理解机器学习的应用有个感觉 盒子模型来解释隐马尔可夫模型 - 简介 盒子模型来解释隐马尔可夫模型 - 前向算法 盒子模型…

引擎启动:Spring Boot汽车资讯新纪元

1系统概述 1.1 研究背景 随着计算机技术的发展以及计算机网络的逐渐普及&#xff0c;互联网成为人们查找信息的重要场所&#xff0c;二十一世纪是信息的时代&#xff0c;所以信息的管理显得特别重要。因此&#xff0c;使用计算机来管理汽车资讯网站的相关信息成为必然。开发合适…

k8s 学习笔记之 k8s 存储管理

文章目录 概述卷卷的常用类型emptyDir边车容器 HostPathnfsPV/PVC静态供给 PV 和 PVC创建静态 PV创建 pvc创建 pod 应用 pvc 动态供给 PV 和 PVC创建 StorageClass创建 pvc创建 pod 使用 pvc PV 的生命周期 内置存储对象ConfigMapSecret 配置文件自动重新加载方案**1. 应用内动…

C语言内存:我家大门常打开

C语言本着自由开放的理念&#xff0c;并不禁止程序访问非法内存。 什么是非法内存&#xff1f;就是那本不是你家的地&#xff0c;你却硬跑过去种庄稼。 或者&#xff0c;你在澡堂子里拿着自己的钥匙去捅别人的柜。 这种行为当然后果难料。 可能你捅了半天&#xff0c;火花冒…

【Maven】nexus 配置私有仓库配置【转】

介绍&#xff1a;【Maven】Nexus几个仓库的介绍-CSDN博客 一、仓库类型 proxy 远程仓库的代理&#xff0c;比如说nexus配置了一个central repository的proxy,当用户向这个proxy请求一个artifact的时候&#xff0c;会现在本地查找&#xff0c;如果找不到&#xff0c;则会从远程…

持续集成与持续部署:CI/CD实现教程

以下是一个基于常见工具实现 CI/CD 的基本教程示例&#xff0c;这里以 Git、Jenkins、Maven&#xff08;用于 Java 项目构建和管理依赖&#xff0c;其他语言项目可替换为对应构建工具&#xff09;以及 Docker&#xff08;用于容器化部署&#xff0c;非必需但很常用&#xff09;…

Apache Paimon】-- 6 -- 清理过期数据

目录 1、简要介绍 2、操作方式和步骤 2.1、调整快照文件过期时间 2.2、设置分区过期时间 2.2.1、举例1 2.2.2、举例2 2.3、清理废弃文件 3、参考 1、简要介绍 清理 paimon &#xff08;表&#xff09;过期数据可以释放存储空间&#xff0c;优化资源利用并提升系统运行效…