Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【愚公系列】《微信小程序与云开发从入门到实践》038-在小程序中使用WebSocket技术

【愚公系列】《微信小程序与云开发从入门到实践》038-在小程序中使用WebSocket技术

原创
作者头像
愚公搬代码
发布于 2025-01-25 00:48:03
发布于 2025-01-25 00:48:03
22900
代码可运行
举报
运行总次数:0
代码可运行

标题

详情

作者简介

愚公搬代码

头衔

华为云特约编辑,华为云云享专家,华为开发者专家,华为产品云测专家,CSDN博客专家,CSDN商业化专家,阿里云专家博主,阿里云签约作者,腾讯云优秀博主,腾讯云内容共创官,掘金优秀博主,亚马逊技领云博主,51CTO博客专家等。

近期荣誉

2022年度博客之星TOP2,2023年度博客之星TOP2,2022年华为云十佳博主,2023年华为云十佳博主等。

博客内容

.NET、Java、Python、Go、Node、前端、IOS、Android、鸿蒙、Linux、物联网、网络安全、大数据、人工智能、U3D游戏、小程序等相关领域知识。

欢迎

👍点赞、✍评论、⭐收藏

🚀前言

在当今信息化时代,实时数据交互已成为应用程序的重要特性之一。小程序作为一种新兴的轻量级应用,越来越多地被用于即时通讯、在线游戏、实时更新等场景。而WebSocket技术,凭借其持久连接和低延迟的优势,成为实现实时数据传输的理想选择。

在本篇文章中,我们将深入探讨如何在小程序中使用WebSocket技术。我们将介绍WebSocket的基本原理、如何在小程序中建立与服务器的连接、发送和接收消息的具体操作,以及常见的应用场景和实践经验。通过这些内容,希望能够帮助开发者掌握WebSocket技术,提升小程序的实时交互能力,创造出更加流畅和丰富的用户体验。

让我们一起探索WebSocket在小程序中的应用潜力,共同推动小程序的创新与发展!

🚀一、在小程序中使用WebSocket技术

在大部分小程序产品的业务需求中,与后端进行的数据交互都将采用HTTP请求的方式行。但是HTTP请求有一些局限性,比如只能由客户端发起,服务端被动地将客户端需要的数返回,服务端无法主动地将推送数据到客户端。在一些特殊的应用场景中,这一局限性将非常命,比如实时游戏类的应用,客户端和服务端不仅交互频繁,而且需要服务端主动推送数据到户端,社交类应用也类似,消息的接收是需要服务端主动推送的。幸运的是,小程序开发框架中提供了 WebSocket相关的接口,使用Webocket 技术可以方便地实现与服务端的全双工通信。

🔎1.编写一个简易的 WebSocket 服务端

🦋1.1 在小程序中使用 WebSocket 技术

WebSocket 技术提供了客户端与服务端之间的全双工通信方式。在小程序中使用 WebSocket 技术时,我们需要一个支持 WebSocket 协议的服务端。可以使用 Node.js 快速搭建一个本地 WebSocket 服务端来与小程序进行通信测试。

🦋1.2 安装 Node.js

首先,确保你安装了 Node.js,步骤如下:

  1. 访问 Node.js 官网:https://nodejs.org/
  2. 官网页面上会有两个按钮:
    • LTS(稳定版): 适合大多数用户。
    • Current(当前版本): 包含最新的功能,适合开发者使用。

根据需求选择其中一个版本进行下载和安装。

  1. 下载完成后,按普通软件的方式进行安装。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

🦋1.3 安装 WebSocket 模块

安装完 Node.js 后,我们还需要安装 WebSocket 模块,才能在 Node.js 中使用 WebSocket 技术。可以通过 npm(Node.js 配套的包管理工具)来安装 WebSocket 模块。

  1. 打开终端(Terminal),在终端中输入以下指令来安装 WebSocket 模块:
代码语言:bash
AI代码解释
复制
npm install ws
  1. 安装完成后,即可开始编写 WebSocket 服务端代码。

🦋1.4 编写 WebSocket 服务端代码

  1. 在任意位置新建一个名为 ws.js 的文件(无需将其放入小程序项目中)。
  2. ws.js 文件中编写如下测试代码:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 引入 WebSocket 服务器实例
var WebSocketServer = require('ws').Server;

// 创建一个 WebSocket 服务,绑定到本地的 8181 端口
var wss = new WebSocketServer({ port: 8181 });

// 监听客户端的连接动作
wss.on('connection', function(ws) {
    console.log('服务端: 客户端已连接');

    // 客户端连接后,监听此连接发来的消息
    ws.on('message', function(message) {
    let buf = Buffer.from(message);
    let string = buf.toString('utf-8');
    console.log("服务器: 收到消息", string);

    // 将客户端发来的消息再原样发送给客户端
    ws.send("服务端收到了-" + string + "-");
    });
});
  • WebSocketServer:引入 WebSocket 服务器类。
  • wss.on('connection', ...):监听客户端的连接请求。
  • ws.on('message', ...):监听从客户端发送来的消息,并将其打印到控制台。
  • ws.send(...):将消息发送回客户端。
  1. 代码实现了一个简易的 WebSocket 服务器。仅需要 9 行代码,就可以实现 WebSocket 服务端功能。

🦋1.5 运行 WebSocket 服务端

  1. 在终端中进入到 ws.js 文件所在的目录。
  2. 执行以下命令来启动 WebSocket 服务端:
代码语言:bash
AI代码解释
复制
node ws.js

如果终端没有任何异常信息输出,则表明服务端已经成功启动,并且正在等待客户端的连接。

  1. 退出服务端:如果想停止服务端,可以在终端中按 Ctrl + C 组合键。

🦋1.6 小程序连接 WebSocket 服务

服务端已经搭建好了,可以通过小程序中的 WebSocket 客户端代码连接该服务。后续可以通过在小程序中实现 WebSocket 客户端,测试与该服务端的通信。

在这里插入图片描述
在这里插入图片描述

🔎2.编写WebSocket 客户端示例程序

🦋2.1 在小程序中使用 WebSocket 技术

在小程序中使用 WebSocket 技术,可以通过与服务端建立 WebSocket 连接,实现实时消息的传输。这里我们将创建一个名为 webSocketDemo 的页面,通过按钮触发消息发送和接收。

🦋2.2 创建 WebSocket 页面文件

☀️2.1.1 webSocketDemo.wxml 文件

在小程序中创建一个名为 webSocketDemo 的页面,并在 webSocketDemo.wxml 文件中编写以下代码:

代码语言:xml
AI代码解释
复制
<!-- pages/webSocketDemo/webSocketDemo.wxml -->
<button type="primary" bindtap="send">发消息到服务端</button>

<view wx:for="{{msgs}}">
{{index}}: {{item}}
</view>
  • 按钮组件:当用户点击此按钮时,将会触发 send 函数,发送消息到 WebSocket 服务端。
  • 消息列表:通过 wx:for 将服务端返回的消息列表渲染到页面上。
☀️2.1.2 webSocketDemo.js 文件

webSocketDemo.js 文件中实现相应的逻辑:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// pages/webSocketDemo/webSocketDemo.js
Page({
  data: {
    msgs: [],  // 存储接收到的消息
  },

  // 发送消息到服务端
  send: function () {
    wx.sendSocketMessage({
      data: "客户端发来的信息"
    });
  },

  // 页面加载时创建 WebSocket 连接
  onLoad: function (options) {
    // 创建 WebSocket 连接
    wx.connectSocket({
      url: 'ws://localhost:8181',  // 服务端地址
    });

    // 连接成功的回调
    wx.onSocketOpen(function (res) {
      console.log("连接成功");
    });

    // 接收到消息的回调
    wx.onSocketMessage((result) => {
      console.log(result.data);
      this.data.msgs.push(result.data);  // 将接收到的消息加入到 msgs 数组中
      this.setData({
        msgs: this.data.msgs  // 更新页面显示
      });
    });
  }
});

代码说明:

  • wx.connectSocket():用于连接 WebSocket 服务端。
  • wx.onSocketOpen():当连接成功时的回调函数。
  • wx.onSocketMessage():当接收到服务端消息时的回调函数。
  • wx.sendSocketMessage():用于向 WebSocket 服务端发送消息。

🦋2.3 运行与测试

  1. 运行 Node.js 服务端程序:首先确保前面编写的 Node.js WebSocket 服务端程序已经运行,并监听在 ws://localhost:8181 端口。
  2. 在小程序中预览:在小程序模拟器中预览 webSocketDemo 页面。
  3. 测试功能:点击页面上的按钮发送消息。每点击一次按钮,就会向服务端发送一条消息,服务端接收到后会响应,并返回相同的消息。客户端会在页面上显示接收到的所有消息。
在这里插入图片描述
在这里插入图片描述

🦋2.4 服务端输出

当客户端发送消息后,服务端会输出以下信息,说明客户端已经连接并且消息已经收到:

在这里插入图片描述
在这里插入图片描述

🦋2.5 进一步扩展:客户端间的实时通信

通过 WebSocket 技术,服务端可以同时连接多个客户端并转发消息。这样,服务端可以作为一个转发层,帮助不同客户端之间进行实时通信。实现这一功能需要在服务端添加消息转发逻辑,当接收到某个客户端的消息时,将其转发给其他客户端。

🔎3.WebSocket相关接口详解

🦋3.1 小程序 WebSocket 功能接口概述

在小程序的开发框架中,提供了一系列以 wx 开头的 WebSocket 功能接口。使用 WebSocket 的第一步是先创建一个 WebSocket 连接,通常使用 wx.connectSocket 方法来完成。

wx.connectSocket 方法

该方法用于发起与 WebSocket 服务端的连接。其配置参数可以灵活地控制 WebSocket 连接的相关属性。

wx.connectSocket 方法的参数

wx.connectSocket 方法的参数是一个对象,包含以下可配置的属性:

属性名

类型

说明

url

字符串

WebSocket 服务的地址(例如 ws://localhost:8181)。

header

对象

发起连接时的 HTTP 请求头部字段。

protocols

数组

设置所使用的子协议数组。

tcpNoDelay

布尔值

设置是否启用 TCP_NODELAY 选项。

perMessageDeflate

布尔值

设置是否开启 WebSocket 的压缩扩展。

timeout

数值(毫秒)

设置超时时间,单位为毫秒。

success

函数

连接成功后的回调函数。

fail

函数

连接失败后的回调函数。

complete

函数

接口调用完成后的回调函数(无论成功或失败)。

连接的生命周期

  1. 建立连接:通过 wx.connectSocket 方法建立 WebSocket 连接。
  2. 连接打开:连接成功后,可以使用 wx.onSocketOpen 方法来监听连接打开的事件。
  3. 接收消息:连接成功后,可以通过 wx.onSocketMessage 来监听服务端发来的消息。
  4. 发送消息:可以使用 wx.sendSocketMessage 方法向服务端发送消息。
  5. 关闭连接:当通信完成或不再需要时,可以使用 wx.closeSocket 来关闭连接。
  6. 监听关闭:可以使用 wx.onSocketClose 来监听连接关闭事件。
  7. 监听错误:通过 wx.onSocketError 方法可以监听 WebSocket 连接中的异常。

🦋3.2 通过 SocketTask 对象管理连接

如果需要同时管理多个 WebSocket 连接,直接使用 wx.connectSocket 方法可能会变得复杂。为此,wx.connectSocket 方法会返回一个 SocketTask 对象,该对象专门用于管理当前连接。

使用 SocketTask 对象

通过 SocketTask 对象,你可以更加便捷地管理每个 WebSocket 连接,包括发送消息、监听事件和关闭连接等操作。每个 SocketTask 对象都与一个特定的 WebSocket 连接关联。

示例代码:使用 SocketTask

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 创建 WebSocket 连接
var task = wx.connectSocket({
  url: 'ws://localhost:8181'  // 服务端地址
});

// 监听连接成功事件
task.onOpen(() => {
  console.log("连接成功");
});

// 监听接收到的消息
task.onMessage((result) => {
  console.log(result.data);
  this.data.msgs.push(result.data);  // 将接收到的消息添加到消息数组
  this.setData({
    msgs: this.data.msgs  // 更新页面显示
  });
});

SocketTask 对象的方法

SocketTask 对象封装了一些方法,用于管理 WebSocket 连接:

方法名

说明

close

主动关闭 WebSocket 连接。

onClose

监听连接关闭事件。

onError

监听 WebSocket 异常事件。

onMessage

监听接收到服务端消息的事件。

onOpen

监听 WebSocket 连接打开事件。

send

发送消息到服务端。

SocketTask 的方法详解

  • close(): 用于关闭 WebSocket 连接。
  • onClose(callback): 监听 WebSocket 连接关闭事件。当连接关闭时,执行 callback 回调。
  • onError(callback): 监听 WebSocket 连接中的错误事件。
  • onMessage(callback): 监听接收到的服务端消息。当服务端发送消息时,执行 callback 回调。
  • onOpen(callback): 监听 WebSocket 连接成功打开的事件。成功打开时,执行 callback 回调。
  • send(data): 向服务端发送消息,data 为要发送的消息内容。

🦋3.3 WebSocket 连接与消息传输流程

  1. 创建 WebSocket 连接
    • 调用 wx.connectSocket 方法建立 WebSocket 连接。
    • 返回一个 SocketTask 对象,可以通过此对象管理连接。
  2. 监听连接事件
    • 使用 task.onOpen() 监听连接成功事件。
    • 使用 task.onMessage() 监听接收到的服务端消息。
    • 使用 task.onError() 监听异常事件。
    • 使用 task.onClose() 监听连接关闭事件。
  3. 发送消息
    • 使用 task.send() 方法发送消息到 WebSocket 服务端。
  4. 关闭连接
    • 使用 task.close() 方法主动关闭连接。

🦋3.4 其他协议支持

除了 WebSocket 外,小程序还支持直接使用更底层的 TCPUDP 协议进行通信。WebSocket 本身就是基于 TCP 协议实现的,所以如果需要更高效、底层的通信,可以考虑使用 TCP 或 UDP。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
红帽下查看HBA卡的信息
HBA卡主要用于安装在服务器上,连接到光纤交换机,或者也可以直联到存储,在存储和服务器之间形成FC SAN。现在HBA卡的速率一般为8GB、16GB,32G。一张卡上一般有一个或者两个网口,HBA卡的厂商一般有Qlogic和Emulex。在具体使用时,服务器一般是安装两块HBA卡,从两块卡上在连接到光纤交换机,确保安全性。
用户10312993
2023/01/18
4K0
PowerEdge MX搭个SAN网络?So easy~
在之前的系列文章中,我们已经介绍了PowerEdge MX的超融合实现和未来支持的“可组合架构”,作为融合主流架构之一,SAN网络存储优点多多,部署起来却并不容易。
用户6543014
2019/10/25
1.1K0
PowerEdge MX搭个SAN网络?So easy~
博科300 光纤交换机的配置
二、基本配置 1、配置IP、修改用户密码 a.新的光纤交换机默认ip为:10.77.77.77,需直连配置ip
全栈程序员站长
2022/08/26
2.9K0
博科300 光纤交换机的配置
新三网融合——计算存储与网络
网络转发设备用于传输流量,不同类型的流量对网络的需求是不同的。数据中心中有三大类资源,计算、存储和网络,之前讲过的数据网络都是用来传输用户到用户的应用流量的,这类流量对于网络的容忍度比较高,丢包多一点、时延高一点或者抖动大一点都没什么关系,以太网+TCP/IP的协议栈基本上统治了数通网络领域,而这套协议栈用于存储资源间或者是计算资源间的通信却很不合适。存储业务对于丢包几乎是零容忍的(想想你存了一大笔钱,然而在银行数据库写存储时,账户上的数字少了个0会是个多大的灾难),而以太网和IP都是尽力而为的,传输控制需
SDNLAB
2018/04/02
2K0
新三网融合——计算存储与网络
光纤交换机划分zone方法
help命令提示你如何操作。zonehelp提示你如何操作zone。zonecreate命令创建zone。命令如下:zonecreate”zone_name”,”number;number”。
全栈程序员站长
2022/08/26
1.5K0
光纤交换机zone配置
1、命令 cat /sys/class/fc_host/host[N]/port_state,显示online则证明链路状态正常
全栈程序员站长
2022/08/25
2.6K0
光纤交换机zone配置
图解存储架构:NAS vs. SAN vs. DAS
NAS、SAN、DAS是常见三种存储方式,乍一看就像是英文字母的排列组合,但实际上大有不同。这就好比一个女孩子让你修电脑,但是她们的初衷不同,实现的方法也不同,最后的结果自然也会大相径庭。比如,有的男生修完电脑后,可能会收获一个女朋友。当然,也有可能她真的只是找你修电脑。 通过这个例子,我们来看NAS、SAN和DAS似乎是同一个原理。NAS、SAN和DAS的目的是一样的:存储。但其初衷、过程和结果是不同的。
SDNLAB
2021/12/28
5.4K0
图解存储架构:NAS vs. SAN vs. DAS
博科SAN交换机zone配置(华为SNS系列交换机为例OEM博科)[通俗易懂]
一、zone的定义 Zone是Brocade交换机上的标准功能,FC SWITCH上的Zone功能类似于以太网交换机上的VLAN功能,它是将连接在SAN网络中的设备(主机和存储),逻辑上划到为不同的区域内,使得不同区域中的设备相互间不能FC网络直接访问,从而实现网络中的设备之间的相互隔离。
全栈程序员站长
2022/08/31
5.6K0
博科SAN交换机zone配置(华为SNS系列交换机为例OEM博科)[通俗易懂]
EMC光纤交换机配置
服务器HBA连接光纤交换机,再通过光纤交换机连接EMC存储SPA、SPB控制器。需要分配存储空间的服务器HBA要求与EMC 控制器在光纤交换机上划分在同一个Zone内。如此,存储上才能识别到HBA卡WWN号,并为服务器映射Lun空间。
用户5760343
2022/05/24
1.6K0
Multipath多路径管理基础介绍与安装配置使用
工作原理: 当因为主机HBA卡、线缆、交换机或者存储设备的RAID控制器故障等原因造成一条物理路径失效时,服务器可以将通过此物理路径的I/O转移到其他正常的物理路径上面,应用程序不会觉察到这种改变,从而提高系统的可用性。
全栈工程师修炼指南
2022/09/29
14.9K0
Multipath多路径管理基础介绍与安装配置使用
OceanStor篇章5.OceanStor篇章.企业统一存储技术基本概念之多路径技术
①存储阵列与主机之间有两条路径,并映射3个LUN给主机,则在主机上生成6个SCSI设备;UltraPath(华为自研多路径软件)通过WWN判断出这6个SCSI设备来自于3个LUN,则生成了3个虚拟磁盘,每个虚拟磁盘有两个path:
ICT系统集成阿祥
2024/12/03
1000
OceanStor篇章5.OceanStor篇章.企业统一存储技术基本概念之多路径技术
博科brocade光纤交换机alias-zone的划分–>实操案例「建议收藏」
光纤交换机作为SAN网络的重要组成部分,在日常应用中非常普遍,本次将以常用的博科交换机介绍基本的配置方法。
全栈程序员站长
2022/08/31
2.5K0
博科brocade光纤交换机alias-zone的划分–>实操案例「建议收藏」
FC-SAN与IP-SAN那些事
  其实在前几年我们根本就没有讨论FC-SAN与IP-SAN优劣势的必要,因为在那个时候的存储区域网业界还是被光纤传输模式一统天下,并且在相当长的一段时间里面表现出了优异的性能、可靠性和可扩展性。但是在这几年来以来,随着IP-SAN存储设备的出现,其携便利的扩展性和低廉的价格向FC-SAN发起了一轮又一轮的冲击,现今已经成为了主要的存储使用用途之一。   那么在这个事关业务应用核心数据安全、高效传输的存储区域网到底采用何种方式搭建才能发挥应有的优势呢?本文力求从数据传输性能、传输稳定性、存储区域网的可扩展性、存储区域网设备的可靠性和SAN网络的可管理性共5个方面来对FC-SAN和IP-SAN进行一个对比。
数据库架构之美
2022/11/23
2.5K0
FC-SAN与IP-SAN那些事
一文读懂服务器的HBA卡
HBA 卡,全称主机总线适配器(Host Bus Adapter) ,是服务器与存储装置间的关键纽带,承担着输入 / 输出(I/O)处理及物理连接的重任。作为一种电路板或集成电路适配器,HBA 卡能实现服务器内部 I/O 通道与存储系统 I/O 通道的物理连接。
ICT系统集成阿祥
2025/01/17
6390
一文读懂服务器的HBA卡
存储07-存储多链路分析
假设lun0|1|2|3都可以被host01|02看到(存储内部需要做lun和主机的wwpn映射;wwwp是主机hba卡的硬件地址类似于网卡的mac地址)
大话IT架构
2020/03/31
9970
存储07-存储多链路分析
iSCSI存储的3种连接方式
我们分析了iSCSI存储的系统结构,下面来看iSCSI是如何与服务器、工作站等主机设备来连接的,也就是我们如何建立一个iSCSI网络存储系统。
py3study
2020/01/06
3.3K0
DAS / NAS / IP SAN / FC SAN区别
NAS:网络上直接挂接的存储设备,其实就是处于以太网上的一台利用NFS、CIFS等网络文件系统的文件共享服务器。
党志强
2020/02/11
6.8K0
存储基础:DAS/NAS/SAN存储类型及应用
一. 硬盘接口类型 1. 并行接口还是串行接口 (1) 并行接口,指的是并行传输的接口,比如有0~9十个数字,用10条传输线,那么每根线只需要传输一位数字,即可完成。 从理论上看,并行传输效率很高,但是由于线路上的物理原因,它的传输频率不能太高,所以实际的传输速度并不和并行度成正比,甚至可能更差。 (2) 串行接口,指的是串行传输的接口,同样是0~9十个数字,用1条传输线,那么需要传输10次,才可以完成。 从理论上看,串行传输效率不高,但是由于它的数据准确性,高频率的支持,使得传输速度可以很高。 (3) 并
小小科
2018/05/02
3.5K0
存储基础:DAS/NAS/SAN存储类型及应用
SAN、NAS、DAS是什么东西?它们之间有什么关联?
前言: 数据中心机房设备分类众多,大大小小的设备零部件及部位,都是决定着数据中心是否安全运营的基础,下面普及总结中心技术名词,SAN、NAS、DAS,是什么意思?它们之间有什么关联? (1)SAN SAN是一种储存技术,也是是千兆位速率的网络,它依托光纤通道为服务器和存储设备之间的连接提供更高的吞吐能力、支持更远的距离和更可靠的连通,SAN可以是交换式网络,也可以是共享式网络,以目前的技术,其中任何一种网络都能够提供更好的伸缩性、故障恢复和诊断信息;此外,以其中任何一种网络为基础建设SAN都不需要对现有
企鹅号小编
2018/01/09
5.4K0
SAN、NAS、DAS是什么东西?它们之间有什么关联?
虹科方案|在虚拟化环境中使用ATTO XstreamCORE®智能网桥的安全、简单SAN解决方案
在具有外部串行连接存储 (SAS) 阵列的典型直连环境中,使用 vMotion® 完成从一台 ESXi 主机到另一台主机的数据传输可能需要数小时,即使遵循了隔离 vMotion 网络的正确建议也是如此。除了常见的负载均衡迁移,vMotion 迁移虚拟机 (VM) 最关键的时间通常是主机资源关闭或处于胁迫状态时。在这些情况下,据观察,运行大约 250-400 GB大小的VM 需要30多个小时才能完成迁移。在这些环境中,避免这种情况的最佳方法是使用存储区域网络 (SAN) 技术。 在SAN环境中,这些实时vMotion迁移可能需要不到三分钟的时间,因为所有ESXi主机都连接到所有存储阵列。
虹科网络基础设施
2023/01/31
5510
虹科方案|在虚拟化环境中使用ATTO XstreamCORE®智能网桥的安全、简单SAN解决方案
相关推荐
红帽下查看HBA卡的信息
更多 >
LV.8
这个人很懒,什么都没有留下~
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档