websocket 发送ping_那些很重要,但是不常用的技术,websocket

聊聊分布式下的WebSocket解决方案 前言 最近自己搭建了个项目,项目本身很简单,但是里面有使用WebSocket进行消息提醒的功能,大体情况是这样的。 发布消息者在系统中发送消息,实时的把消息推送给对应的一个部门下的所有人。 这里面如果是单机应用的情况时,我们可以通过部门的id和用户的id组成一个唯一的key,与应用服务器建立WebSocket长连接,然后就可以接收到发布消息者发送的消息了。 但是真正把项目应用于生产环境中时,我们是不可能就部署一个单机应用的,而是要部署一个集群。 所以我通过Nginx+两台Tomcat搭建了一个简单 阅读详情

1. 为什么会有websocket

2. websocket协议格式

3. 协议具体实现

一、为什么需要 WebSocket?

初次接触 WebSocket 的人,都会问同样的问题:我们已经有了 HTTP 协议,为什么还需要另一个协议?它能带来什么好处?

答案很简单,因为 HTTP 协议有一个缺陷:通信只能由客户端发起

举例来说,我们想了解今天的天气,只能是客户端向服务器发出请求,服务器返回查询结果。HTTP协议做不到服务器主动向客户端推送信息。

这种单向请求的特点,注定了如果服务器有连续的状态变化,客户端要获知就非常麻烦。我们只能使用"轮询":每隔一段时候,就发出一个询问,了解服务器有没有新的信息。最典型的场景就是聊天室。

轮询的效率低,非常浪费资源(因为必须不停连接,或者HTTP连接始终打开)。因此,工程师们一直在思考,有没有更好的方法。WebSocket就是这样发明的

WebSocket协议在2008年诞生,2011年成为国际标准。所有浏览器都已经支持了。

它的最大特点就是,服务器可以主动向客户端推送信息,客户端也可以主动向服务器发送信息,是真正的双向平等对话,属于服务器推送技术的一种。

其他特点包括:

1)建立在 TCP 协议之上,服务器端的实现比较容易。

(2)与 HTTP 协议有着良好的兼容性。默认端口也是80和443,并且握手阶段采用 HTTP 协议,因此握手时不容易屏蔽,能通过各种 HTTP 代理服务器。

(3)数据格式比较轻量,性能开销小,通信高效。

(4)可以发送文本,也可以发送二进制数据。

(5)没有同源限制,客户端可以与任意服务器通信。

(6)协议标识符是ws(如果加密,则为wss),服务器网址就是 URL。

websocket协议格式

Browser已经支持http协议,为什么还要开发一种新的WebSocket协议呢?我们知道http协议是一种单向的网络协议,在建立连接后,它只允许Browser/UA(UserAgent)向WebServer发出请求资源后,WebServer才能返回相应的数据。而WebServer不能主动的推送数据给Browser/UA,当初这么设计http协议也是有原因的,假设WebServer能主动的推送数据给Browser/UA,那Browser/UA就太容易受到攻击,一些广告商也会主动的把一些广告信息在不经意间强行的传输给客户端,这不能不说是一个灾难。那么单向的http协议给现在的网站或Web应用程序开发带来了哪些问题呢?

一条连接上只可以发送一个请求
请求只能从客户端开始。客户端不可以接收除了响应以外的指令。
请求 / 响应首部未经过压缩就直接进行传输。首部的信息越多,那么延迟就越大。
发送冗长的首部。每次互相发送相同的首部造成的浪费越多
可以任意选择数据压缩格式。非强制压缩发送
ajax轮询

ajax(异步的javascript与xml技术)是一种有效利用javascript和dom的操作,以达到局部web页面的提花和加载的异步通信手段。和以前的同步通信相比,他只更新一部分页面,相应中传输饿数据量会因此的减少。

ajax轮询的原理是,让浏览器每隔一段时间就发送一次请求,询问服务器是否有新消息。
而利用ajax实时的从服务器获取内容,有可能导致大量的请求产生。


长轮询

原理和ajax轮询差不多,都是采用轮询的方式,不过采用的是阻塞模型。也就是说,当客户端发起连接后,如果服务器端内容没有更新,将响应至于挂起状态,一直不回复response给客户端,知道有内容更新,再返回响应。

虽然可以做到实时更新,但是为了保留响应,一次连接饿持续时间也变长了。期间,为了维持连接会消费更多的资源。

从上面两种方式中,其实可以看出是再不断的建立http连接,然后等待服务器处理,可以体现出了http的特点:被动性,即:请求只能由客户端发起。服务器端不能主动联系客户端。
不管怎么样,上面这两种都是非常消耗资源的。
ajax轮询 需要服务器有很快的处理速度和资源。(速度)
长轮询 需要有很高的并发,也就是说同时接待客户的能力。(场地大小)

除了以上这些,HTTP还是一个无状态协议。
通俗的说就是,服务器因为每天要接待太多浏览器了,是个健忘鬼,你一断连接,他就把你的东西全忘光了,把你的东西全丢掉了。你第二次还得再告诉服务器一遍。

WebSocket

WebSocket其实是HTTP协议上的一种补充,他们有交集但并不是全部。


一旦web服务器和客户端建立起websocket协议的通信连接,之后所有的通信都依靠这个专用连接进行。只需要经过一次HTTP请求,就可以做到源源不断的信息传送了。


websocket是基于HTTP协议的,或者说借用了http的协议来完成一部分握手。为了实现websocket通信,在http建立连接后,还需要进行一次“握手”的步骤。

握手 · 请求

GET /chat HTTP/1.1 Host: server.example.com Upgrade: websocket Connection: Upgrade Sec-WebSocket-Key: x3JJHMbDL1EzLkh9GBhXDw== Sec-WebSocket-Protocol: chat, superchat Sec-WebSocket-Version: 13 Origin: http://example.com
为了实现websocket通信,需要用到http的Upgrade首部字段,告知服务器通信协议已发生改变:我要发起的是websocket协议。以达到握手的目的。
Sec-WebSocket-Key字段记录着握手必不可少的键值,用于验证服务器是否支持websocket通信。
Sec-WebSocket-Protocol字段记录的是所需要使用的协议。

握手 · 响应

HTTP/1.1 101 Switching Protocols Upgrade: websocket Connection: Upgrade Sec-WebSocket-Accept: HSmrc0sMlYUkAGmm5OPpG2HaGWk= Sec-WebSocket-Protocol: chat
对于客户端的请求,服务器返回状态码 101 Switching Protocols的响应。
返回Upgrate告诉客户端即将升级的协议是Websocket协议。
Sec-WebSocket-Accept字段值是由握手请求中的Sec-WebSocket-Key字段值加密过后生成的。
Sec-WebSocket-Protocol 则是表明最总使用的协议。

到这里,http已经完成所有他的工作了,接下来通信时不再使用HTTP的数据帧,而是使用websocket独立的数据帧。


因此,websocket协议具有以下的特点:

推送功能
支持服务器端向客户端推送功能。服务器可以直接发送数据而不用等待客户端的请求。
减少通信量
只要建立起websocket连接,就一直保持连接,在此期间可以源源不断的传送消息,直到关闭请求。也就避免了HTTP的非状态性。
减少资源消耗
那么为什么他会解决服务器上消耗资源的问题呢?
其实我们所用的程序是要经过两层代理的,即HTTP协议在Nginx等服务器的解析下,然后再传送给相应的Handler(PHP等)来处理。
简单地说,我们有一个非常快速的接线员(Nginx),他负责把问题转交给相应的客服(Handler)。本身接线员基本上速度是足够的,但是每次都卡在客服(Handler)了,老有客服处理速度太慢。导致客服不够。Websocket就解决了这样一个难题,建立后,可以直接跟接线员建立持久连接,有信息的时候客服想办法通知接线员,然后接线员在统一转交给客户。这样就可以解决客服处理速度过慢的问题了。
协议具体实现

前提:

本人最近做的项目,服务器端用的是C++写的,而与客户端交互用的是websocket,服务器端要想正常的使用数据,必须要对websocket协议进行解析。

WebSocket数据格式


FIN:表示这个数据是不是接收完毕,为1表示收到的数据是完整的,占1bit
RSV1~3:用于扩展,通常都为0,各占1bit
OPCODE:表示报文的类型,占4bit 0x00:标识一个中间数据包0x01:标识一个text数据包0x02:标识一个二进制数据包0x03~07:保留0x08:标识一个断开连接数据包0x09:标识一个ping数据包0x0A:标识一个pong数据包0x0B~F:保留
MASK:用于表示数据是否经常掩码处理,为1时,Masking-key即存在,占1bit
Payload len:表示数据长度,即Payload Data的长度,当Payload len为0~125时,表示的值就是Payload Data的真实长度;当Payload len为126时,报文其后的2个字节形成的16bits无符号整型数的值是Payload Data的真实长度(网络字节序,需转换);当Payload len为127时,报文其后的8个字节形成的64bits无符号整型数的值是Payload Data的真实长度(网络字节序,需转换);
Masking-key:掩码,当Mask为1时存在,占4字节32bit
Payload Data:表示数据
C++对websocket协议处理

/*** @brief getWSFrameData 解析websocket的协议包,不能解决粘包半包问题* @param msg 待解析的数据* @param msgLen 待解析的数据长度* @param outBuf 解析完成数据* @return*/int unPackingWSFrameData(char *msg,int msgLen,std::vector &outBuf){//报文长度一定大于2字节,对于小于的,做返回处理if(msgLen < 2){return -3;}uint8_t opcode_ = 0;uint8_t mask_ = 0;uint8_t masking_key_[4] = {0,0,0,0};uint64_t payload_length_ = 0;int pos = 0;//Opcodeopcode_ = msg[pos] & 0x0f;pos++;//MASKmask_ = (unsigned char)msg[pos] >> 7;//Payload lengthpayload_length_ = msg[pos] & 0x7f;pos++;if(payload_length_ == 126){uint16_t length = 0;memcpy(&length, msg + pos, 2);pos += 2;payload_length_ = ntohs(length);}else if(payload_length_ == 127){uint32_t length = 0;memcpy(&length, msg + pos, 8);pos += 8;payload_length_ = ntohl(length);}//Masking-keyif(mask_ == 1){for(int i = 0; i < 4; i++){masking_key_[i] = msg[pos + i];}pos += 4;}//取出消息数据if (msgLen >= pos + payload_length_ ){outBuf.clear();if(mask_ != 1){char* dataBegin = msg + pos;outBuf.insert(outBuf.begin(), dataBegin, dataBegin+payload_length_);}else{for(uint i = 0; i < payload_length_; i++){int j = i % 4;outBuf.push_back(msg[pos + i] ^ masking_key_[j]);}}}else{//此时包长小于报文中记录的包长return -2;}//断开连接类型数据包if ((int)opcode_ == 0x8)return -1;return 0;}
以上函数即实现了对收到websocket数据的解析,返回结果为:vectoroutput;

通常会在函数外面对此进行转换为char*,方便我们使用,见下:

vectoroutput;char* out = &output[0];
当然,现在的解析还不是完美的解决方法,因为在实际的使用当中,会存在接收的包粘包,半包等等问题,而以上函数只能解决收到包正好是一个完整的包的情况;具体解决粘包半包问题,留待下次博客吧!

参考资料:后台私信“资料”送

结尾:

只为记录,只为分享! 愿所写能对你有所帮助。不忘记点个赞,谢谢~

后台私信可以领取 内容包括:C/C++,Linux,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,流媒体, WebRTC ,CDN,P2P,K8S,Docker,Golang, TCP/IP,MTK , 嵌入式 , 协程,DPDK等等 。
————————————————
版权声明:本文为优快云博主「沂琳」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.youkuaiyun.com/weixin_35033275/article/details/112156062

WebSocket开发(心跳监测)功能 在之前的文章中完成了客服对话的Demo功能,但是现在的连接是无限制的长时间连接没有做心跳、失活、超时断连等功能,心跳的实现方法有很多种,并且WebSocket就提供了ping/pong类型的消息。如果是前端发送心跳,后端需要返回心跳,也就是ping pong的过程会有两次数据传递。后端来发送心跳的话,就只需要发送ping,前端不需要回应。这两种后续的处理方式也有各自优缺点。客户端触发:优点灵活控制无需设置主动超时逻辑清晰服务端简单缺点两次消息传递消息内容容易篡改服务端触发:优点节省宽带。... 阅读详情

相关推荐

前端实现WebSocket即时通讯

要实现客户端与服务器端的通信,最常接触的是http(https)协议,http通信只能是客户端发起请求,服务器响应。服务器不能主动向客户端传递消息。 HTTP 协议无法做到服务器主动向客户端推送信息,2008年诞生的WebSocket 协议可以实现客户端与服务器端的双向对话,即:服务器可以主动向客户端推送信息,客户端也可以主动向服务器发送信息。 WebSocket 协议的底层协议也是TCP协议 WebSocket 协议的标识符为ws,加密后为wss WebSocket 协议没有同源限制,即WebSocke

m0_67400972的博客 804

js 链接websocket马上断开_一文让你彻底搞懂 WebSocket 的原理

一、概述上一篇文章《浅析一次HTTP请求》我们分析了简单的一次 HTTP 请求具体是怎么样完成的,分析了 HTTP 协议的数据结构,如何连接,如何断开,又是如何多路复用的,那么今天我们来聊聊另外一个协议,WebSocket。由于 WebSocket 的协议的内容非常多,本文只会取其冰山一角进行简单阐述,不会铺开详细说。二、什么是 WebSocket2.1 WebSocket 产生的背景在 WebS...

weixin_39608748的博客 1862

Android14 有线网络静态IP配置:从固件烧录到系统默认设置

本文详细解析了在Android14系统中,如何通过修改系统框架层和设置应用,为设备预设有线网络静态IP地址,实现固件烧录后即具备指定网络配置的功能。文章深入探讨了从扩展SettingsProvider数据库字段、配置默认值,到在设置应用中读取和应用配置的完整流程,旨在解决工业平板、智能终端等设备在无DHCP网络环境中批量部署的痛点,提升开箱即用体验。

lake5的博客 920

WebSocket协议

WebSocket 是一种基于 HTTP 协议的双向通信协议,可在客户端和服务器之间实现实时通信。它的设计目标是在 Web 应用程序中实现实时数据传输,避免了传统 HTTP 通信的轮询和多次请求,大大减少了网络流量和延迟。WebSocket 通过建立一条与服务器长连接,实现双向信息传递,避免了 HTTP 的半双工和单向请求并响应的机制,可以实现更加实时的应用场景,如在线游戏、在线聊天、实时监测等。

不会骑摩托的程序员不是好的摄影师 5065

华为HCIA-Datacom实战:200人企业园区网从规划到部署全流程解析

本文详细解析了华为HCIA-Datacom认证实战中200人企业园区网的规划与部署全流程。从需求分析、组网架构设计到设备选型、VLAN划分及安全策略实施,全面覆盖园区网建设的关键环节,特别针对部门隔离、无线覆盖和基础安全防护等典型场景提供可落地的解决方案。

f0g1h2的博客 710

【数据库】银行/信贷业务测试工作中涉及的数据库表格

银行/信贷业务测试工作中涉及的数据库表格,金融信贷测试人必看!

孤之鹜的博客 1171

websocket 发送ping_nodejs实现Websocket的数据接收发送

在去年的时候,写过一篇关于websocket的博文:http://www.cnblogs.com/axes/p/3586132.html,里面主要是借助了nodejs-websocket这个插件,后来还用了socket.io做了些demo,但是,这些都是借助于别人封装好的插件做出来的,websocket到底是怎么实现的呢自己之前真没怎么去想过,最近在看朴灵大神的《深入浅出nodejs》时候,看到...

weixin_31952675的博客 3514

整理 钢琴 铃木钢琴教程(铃木)

铃木钢琴 超清PDF

TS的博客 1214

websocket 发送ping_java websocket中的ping-pong 机制

参考源码:文章参考:注:websocket基于tcp协议,它在第一次连接时发起http请求,之后建立握手在websocket中设置setConnectionLostTimeout参数,解释为:Setter for the interval checking for lost connections,意思是间隔检查连接是否丢失整体是调用顺序为:onWebsocketOpen -》 startConn...

weixin_39604983的博客 2767

用 XCO_CP_XLSX 在 ABAP 中写 Excel:从写入访问到样式控制的完整指南

本文介绍了在 ABAP 环境中使用 XCO_CP_XLSX 模块导出 Excel 报表的完整实践方案。文章从获取写入访问权限开始,详细讲解了基于 row_stream 的批量数据写入和基于 cursor 的精细控制两种方法,并提供了创建新文档、添加工作表、设置样式等关键操作示例。通过分层抽象的工作簿-工作表-单元格模型,开发者可以灵活应对企业应用中常见的报表导出需求,特别是在 SAP BTP 和 S/4HANA Cloud 环境下实现高效可靠的 Excel 文件生成与处理。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 163

【HFSS】仿真目录

Author: JiJi\textrm{Author: JiJi}Author: JiJi Created Time: 2026.04.27\textrm{Created Time: 2026.04.27}Created Time: 2026.04.27 Modified Time: 2026.04.27\textrm{Modified Time: 2026.04.27}Modified Time: 2026.04.27如果大家觉得有用,就点个赞吧,在阅读过程中存在任何困惑,可在下方评论区留言~

u011699626的博客 310

websocket 发送ping_WebSocket 协议初探

公司项目使用WebSocket作为主要的请求方式,知其然也要知其所以然,会用也需要知道它的基本原理,所以写此文章分享下自己的浅见,文章主要包括以下内容:WebSocket是什么WebSocket和Socket区别建立连接数据帧格式发送数据聊天Demo代码: github.com/madaoCN/Web… 包含tornado写的 Server 和 Client 脚本 和 简单ws使用实例的iOS代码...

weixin_31688167的博客 1404

【Claude】Auto Mode 触发安全分类器拦截的三种错误变体及对应处理 bug报错已解决

深度解析Claude Auto Mode安全分类器拦截的三种变体:内容拒绝、操作中断、累积触发,含完整排查流程与绕过策略。

博客 7590

websocket 发送ping_websocket 的心跳请求

func writer(ws *websocket.Conn) {pingTicker := time.NewTicker(time.Second * 1)fileTicker := time.NewTicker(time.Second * 1)defer func() {pingTicker.Stop()fileTicker.Stop()ws.Close()}()for {select {cas...

weixin_42105169的博客 4542

SAPIEN ManiSkill3 入门教程(一)

请注意,table.set_pose(pose) 设置的是演员在世界帧中的坐标系姿势。移除的实体可以再次添加到场景中,但已在场景中的实体则不能再次添加。显示器可以是物理的(如显示器),也可以是虚拟的(如 VNC)。我们可以通过 get_pose()、get_linear_velocity() 和 get_angular_velocity()获取演员的运动量(姿势、线速度、角速度)。现在,让我们创建一个斜坡。例如,您可能需要一个简单的碰撞形状来进行快速模拟,但却需要一个复杂的视觉形状来进行逼真的渲染。

机器人控制与仿真应用 3074

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

websocket 发送ping_一文让你彻底搞懂 WebSocket 的原理

一、概述上一篇文章《浅析一次HTTP请求》我们分析了简单的一次 HTTP 请求具体是怎么样完成的,分析了 HTTP 协议的数据结构,如何连接,如何断开,又是如何多路复用的,那么今天我们来聊聊另外一个协议,WebSocket。由于 WebSocket 的协议的内容非常多,本文只会取其冰山一角进行简单阐述,不会铺开详细说。二、什么是 WebSocket2.1 WebSocket 产生的背景在 WebS...

weixin_31265295的博客 1912

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

websocket 发送ping_Netty之WebSocket协议应用开发

上一篇聊了一下使用Netty进行HTTP协议的应用开发,今儿就来说一下HTTP协议的弊端以及WebSocket协议的开发使用。1、HTTP协议的弊端(1)半双工模式:同一时刻,只能有一个方向的数据传输,不能同时传输。(2)消息冗长复杂:包括了一大堆的消息头、消息体等,相比于其它二进制通信传输,冗长而繁琐。2、WebSocket协议WebSocket提供了一种浏览器与服务器间进行全双工通信...

weixin_39911056的博客 1809

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

WebSocket的ping与pong的java实现…

网上大多数例子给的都是echo server,也就是当websocket客户端链接进来以后,客户端发一条消息,服务器就把这条消息原班不动地返回去。而且绝大多数没有进行ping、pong判断。于是就出现一个问题:当电脑浏览器发送pong帧的时候,由于内容为空,于是服务器将空内容转发回去,导致客户端浏览器以为是错误的帧类型,发送关闭信息进行error关闭。   一开始还误以为是浏览器发送ping帧,

flash胜龙的博客 3万+

websocket 发送ping_WebSocket及SocketIO技术简介

我们团队最近对我们的WebSocket服务做了一些修改和升级,也积累了一些经验,借这个契机,我们想用这篇文章,和大家分享一下WebSocket的一些知识和应用经验。WebSocket简介 说到WebSocket,其实不是一个新鲜的技术了,其标准最早在2011年就由IETF颁布,之后由W3C将WebSocketAPI定为标准。简单概括一下,WebSocket是...

weixin_39628864的博客 1247

websocket 发送ping_jmeter如何测试websocket接口

jmeter做接口测试,很多人都是做http协议的接口,就有很多人问websocket的接口怎么测试啊?首先,我们要明白,websocket接口是什么接口。然后,我们怎么用jmeter测试?jmeter要测试websocket接口,需要先下载安装一个websocket samplers by peter doornbosch 的插件,插件安装成功后,再次启动jmeter,会在jmeter取样器最下...

weixin_39854369的博客 861

websocket 发送ping_如何解决websocket ping超时问题?

在运行下面的代码时(理论上它应该每分钟发送一个值)from __future__ import print_functionfrom twisted.internet.ssl import CertificateOptionsoptions = CertificateOptions()from os import environfrom twisted.internet.defer import ...

weixin_29535345的博客 1960

websocket 发送ping_OkHttp 实现 WebSocket 真的太好用了,聊聊长连接如何保活

一、序OkHttp 应该算是 Android 中使用中使用最广泛的网络库了,我们通常会利用它来实现 HTTP 请求,但是实际上它还可以支持 WebSocket,并且使用起来还非常的便捷。那本文就来聊聊,利用 OkHttp 实现 WebSocket 的一些细节,包括对 WebSocket 的介绍,以及在传输前如何做到鉴权、长连接保活及其原理。二、WebSocket 简介2.1 为什么使用 WebSo...

weixin_39629129的博客 1480

WebSocket - Tornado - Ping & Pong

目录 一、Tornado 内置 ping 设置 1-0 ping 帧 1-1 ping 帧 发送 1-2 Tornado setting 相关项 1-3 client & server 端处理 ping 帧 1-3-1 server 端 1-3-2 client 端 - 基于 ws-client 库 二、业务逻辑 ping & pong 2-0 业务逻辑分析 2...

LIN的博客 4063

websocket 发送ping_浅谈 Comet、SSE、WebSocket

前端时空前端网红集结号,传递一线全栈技术,带你穿越前端时空。前言对于前端开发者,我们只做两件事,获取数据,和把数据展示出来。在不同业务场景下,我们需要不同的通信方式和后端交流。在最早的刀耕火种年代,那时候还没有Ajax,我们只能通过URL请求资源,表单提交数据。后来随着大前端的发展以及业务需要,越来越多的通信技术被发明出来。Comet在一些需要浏览器和服务器频繁交流的情况下,如实时分数、...

weixin_33724759的博客 696
上一篇: JS箭头函数
下一篇: PHP设置时区
firstcode666
博客等级 码龄5年 53粉丝 20原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值