【Java架构师入门到精通提升】论Socket的重要性

机器人运动控制-socket通讯和Modbus通讯 一、socket通讯 socket(套接字),是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口,用来描述IP地址和端口,是通信的句柄,应用程序可以通过socket向网络发送请求或者应答网络请求。 TCP/IP,即传输控制协议/网间协议,是一个工业标准的协议集,它是为广域网设计的,追求准确率。 UDP,即用户数据报协议,是与TCP相对应的协议,它是属于TCP/IP协议族中的一种,追求传输速度。 socket通讯流程 socket中TCP的三次握手建立连接详解 我们知道tcp建立连接要进行“三次 阅读详情

Socket不仅在聊天应用程序中需要用到,而且对于学习Asp.net也非常有帮助。你懂得!
实现服务端和客户端互发信息,以及服务端向多个客户端发送信息。
服务端代码1:
public Form1()
{
InitializeComponent();
Control.CheckForIllegalCrossThreadCalls = false;
}
//创建监听用的socket
private void btnStartMonitor_Click(object sender, EventArgs e)
{
//监听的ip地址
IPAddress ip = IPAddress.Parse(txtIP.Text);
//监听的ip地址和端口号
IPEndPoint point = new IPEndPoint(ip, int.Parse(txtPortNumber.Text));
//监听用的socket
Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
//通常每个套接字地址(协议/网络地址/端口)只允许使用一次
//绑定监听的ip地址和端口号
socket.Bind(point);
//监听端口 监听队列的长度:同一个时间等待的个数。
socket.Listen(10);
//点击之后,禁用掉按钮
btnStartMonitor.Enabled = false;
//提示用户程序开始运行了
ShowMsg(“开始运行了…”);
//监听端口,如果有客户端连接,创建通信用socket
//阻塞窗体的运行
//Socket connSocket = socket.Accept();
//用线程来解决窗体假死的问题
Thread th = new Thread(Listen);
th.IsBackground = true;//后台线程
th.Start(socket);
}
//监听是否有客户端连接
void Listen(object o)
{
//监听用的socket
Socket socket = o as Socket;
//监听端口
Socket connSocket = socket.Accept();
//显示远程连接的IP地址和端口号
ShowMsg(connSocket.RemoteEndPoint.ToString());
}
//在文本框显示信息
void ShowMsg(string msg)
{
txtShowMessage.AppendText(msg + “\r\n”);
}

以上代码只能让一个客户端连接服务端,弊端。
服务端代码2完善——循环接收客户端连接:
//监听是否有客户端连接
void Listen(object o)
{
//监听用的socket
Socket socket = o as Socket;
//可以不停地接受客户端的连接
while (true)
{
//负责通信用的socket
Socket connSocket = socket.Accept();
//显示远程连接的IP地址和端口号
ShowMsg(connSocket.RemoteEndPoint.ToString());
//本机的IP地址和端口号
//connSocket.LocalEndPoint
//接收数据
byte[] buffer = new byte[1024 * 1023];
//接收数据,把数据发到buffer中
//num是实际接收到的字节个数
int num=connSocket.Receive(buffer);
//把实际有效的字节转换成字符串
string str = Encoding.UTF8.GetString(buffer, 0, num);
ShowMsg(str);
}
}

服务端代码3完善——循环接收消息:
//监听是否有客户端连接
void Listen(object o)
{
//监听用的socket
Socket socket = o as Socket;
//可以不停地接受客户端的连接
while (true)
{
//负责通信用的socket
Socket connSocket = socket.Accept();
//显示远程连接的IP地址和端口号
ShowMsg(connSocket.RemoteEndPoint.ToString());
//本机的IP地址和端口号
//connSocket.LocalEndPoint
//循环接收消息
while(true)
{
//接收数据
byte[] buffer = new byte[1024 * 1023];
//接收数据,把数据发到buffer中
//num是实际接收到的字节个数
int num=connSocket.Receive(buffer);
//把实际有效的字节转换成字符串
string str = Encoding.UTF8.GetString(buffer, 0, num);
ShowMsg(str);
}
}
}

服务端代码4完善——循环多个客户端并接收信息:
//监听是否有客户端连接
void Listen(object o)
{
//监听用的socket
Socket socket = o as Socket;
//可以不停地接受客户端的连接
while (true)
{
//负责通信用的socket
Socket connSocket = socket.Accept();
//显示远程连接的IP地址和端口号
ShowMsg(connSocket.RemoteEndPoint.ToString());
//本机的IP地址和端口号
//connSocket.LocalEndPoint
//线程接收信息
Thread th = new Thread(RecMsg);
th.IsBackground = true;
th.Start(connSocket);
}
}
//接收信息
void RecMsg(object o)
{
//通信用的socket
Socket connSocket = o as Socket;
//可以不停地接受客户端的内容
while (true)
{
//接受数据
byte[] buffer = new byte[1024 * 1024];
//接受数据,把数据发到buffer中
//num就是实际接受到的字节个数
int num = connSocket.Receive(buffer);
//当telnet关闭,会不停的发送空(0)字节
//把实际有效的字节转化成字符串
string str = Encoding.UTF8.GetString(buffer, 0, num);
ShowMsg(connSocket.RemoteEndPoint.ToString() + “:” + str);
}
}
}

服务端代码5完善——限制客户端连接数:
//限制连接客户端的个数
int count=0;
void Listen(object o)
{
//监听用的socket
Socket socket = o as Socket;
//可以不停地接受客户端的连接
while (count<1000)
{
//负责通信用的socket
Socket connSocket = socket.Accept();
//显示远程连接的IP地址和端口号
ShowMsg(connSocket.RemoteEndPoint.ToString());
//本机的IP地址和端口号
//connSocket.LocalEndPoint
//线程接收信息
Thread th = new Thread(RecMsg);
th.IsBackground = true;
th.Start(connSocket);
}
}

服务端代码6完善——解决“当tenet关闭,会不停地发送空(0)字节”:
//接收信息
void RecMsg(object o)
{
//通信用的socket
Socket connSocket = o as Socket;
//可以不停地接受客户端的内容
while (true)
{
//接受数据
byte[] buffer = new byte[1024 * 1024];
//接受数据,把数据发到buffer中
//num就是实际接受到的字节个数
int num = connSocket.Receive(buffer);
//当telnet关闭,会不停的发送空(0)字节
//当telnet关闭,会不停的发送(0)个字节 客户端断开
if (num == 0)
{
ShowMsg(connSocket.RemoteEndPoint.ToString() + “:退出”);
connSocket.Shutdown(SocketShutdown.Receive);
connSocket.Close();
break;
}
//把实际有效的字节转化成字符串
string str = Encoding.UTF8.GetString(buffer, 0, num);
ShowMsg(connSocket.RemoteEndPoint.ToString() + “:” + str);
}
}
}

客户端代码1:
public Form1()
{
InitializeComponent();
Control.CheckForIllegalCrossThreadCalls = false;
}
//连接服务端和发送信息都要用到同一个socket,将其定义到外边
Socket socket;
//连接服务端
private void btnConnect_Click(object sender, EventArgs e)
{
//客户端连接服务器的ip地址
IPAddress ip = IPAddress.Parse(txtIP.Text);
//客户端连接的服务器的ip地址和端口号
IPEndPoint point = new IPEndPoint(ip, int.Parse(txtPortNumber.Text));
//创建连接使用的socket
socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
try
{
//连接聊天服务器
//服务器没开报错
//由于目标计算机积极拒绝,无法连接。
socket.Connect(point);
ShowMsg(“连接成功”);
}
catch (Exception ex)
{
ShowMsg(ex.Message);
}
}
void ShowMsg(string msg)
{
txtShowMessage.AppendText(msg + “\r\n”);
}
//发送消息
private void btnSendMessage_Click(object sender, EventArgs e)
{
if (socket != null)
{
byte[] buffer = Encoding.UTF8.GetBytes(txtInputMessage.Text);
socket.Send(buffer);
}
else
{
MessageBox.Show(“请先连接”);
}
}

客户端代码7完善——服务端知道客户端关闭的消息:
//接收信息
void RecMsg(object o)
{
//通信用的socket
Socket connSocket = o as Socket;
//可以不停地接受客户端的内容
while (true)
{
//接受数据
byte[] buffer = new byte[1024 * 1024];
//接受数据,把数据发到buffer中
//num就是实际接受到的字节个数
int num = -1;
try
{
//远程主机强迫关闭了一个现有的连接。 当客户端关闭,服务端未关闭时,报错。
num = connSocket.Receive(buffer);
//当telnet关闭,会不停的发送(0)个字节 客户端断开
if (num == 0)
{
ShowMsg(connSocket.RemoteEndPoint.ToString() + “:退出”);
connSocket.Shutdown(SocketShutdown.Receive);
connSocket.Close();
break;
}
//把实际有效的字节转化成字符串
string str = Encoding.UTF8.GetString(buffer, 0, num);
ShowMsg(connSocket.RemoteEndPoint.ToString() + “:” + str);
}
catch (Exception ex)
{
ShowMsg(ex.Message);
//出现异常,跳出循环
break;
}
}
}

服务端代码8完善——服务端给客户端发送消息:
//发送消息
private void btnSendMessage_Click(object sender, EventArgs e)
{
if (connSocket!=null)
{
byte[] buffer = Encoding.UTF8.GetBytes(txtInputMessage.Text);
try
{
connSocket.Send(buffer);
}
catch (Exception ex)
{
ShowMsg(ex.Message);
}
}
}

客户端代码2完善——客户端接收服务端发送的消息:
//接收消息
void RecMsg()
{
while (true)
{
byte[] buffer = new byte[1024 * 1024];
try
{
int num = socket.Receive(buffer);
string str = Encoding.UTF8.GetString(buffer, 1, num );
ShowMsg(str);
}
catch (Exception ex)
{
ShowMsg(ex.Message);
break;
}
}
}
//由于接收消息是一个死循环,需要用到线程
//线程接受消息
Thread th = new Thread(RecMsg);
th.IsBackground = true;
th.Start();

服务端代码9完善——服务端给指定客户端发送消息:
//存储通信用的socket字典
Dictionary<string, Socket> dic = new Dictionary<string, Socket>();
//限制连接客户端的个数
int count = 0;
//监听是否有客户端连接
void Listen(object o)
{
//监听用的socket
Socket socket = o as Socket;
//可以不停地接受客户端的连接
while (count < 100)
{
count++;
//监听端口,如果有客户端连接,创建通信用socket
Socket connSocket = socket.Accept();
//显示远程连接的IP地址和端口号
ShowMsg(connSocket.RemoteEndPoint.ToString());
//本机的IP地址和端口号
//connSocket.LocalEndPoint
//保存当前登录的客户端的socket
string ipport = connSocket.RemoteEndPoint.ToString();
cboUser.Items.Add(ipport);
dic.Add(ipport, connSocket);
//线程接收信息
Thread th = new Thread(RecMsg);
th.IsBackground = true;
th.Start(connSocket);
}
}
//发送消息
private void btnSendMessage_Click(object sender, EventArgs e)
{
//获取下拉框中选择的ip和端口号
string ipport = cboUser.Text;
if (!string.IsNullOrEmpty(ipport))
{
byte[] buffer = Encoding.UTF8.GetBytes(txtInputMessage.Text);
try
{
//根据key获得socket
Socket connSocket = dic[ipport];
connSocket.Send(buffer);
}
catch (Exception ex)
{
ShowMsg(ex.Message);
}
}
else
{
MessageBox.Show(“请选择客户端”);
}
}

两年经验的java程序员可以看哪些实用进阶的书籍? 不废话,直接推荐几本我读过的、自认不错的书。 1、网络编程书籍 网络编程,虽然有了 Netty 框架等很优质的网络框架了,但是理解背后的原理,对咱们定位项目的 bug,优化代码的性能,帮助非常大。 《Java TCP/IP Socket编程》(豆瓣 8.0 分) 这本书,我们既可以去学到必要的网络基础,也能学会怎么用 Java 去网络编程,非常推荐。 对于网络编程,大家都知道,这是易学难精的技能。学懂原理,了解网络编程,看看我上面推荐的书就够了。但是,要精通网络编程,写好网络相关的程序,那是相当不 阅读详情

相关推荐

Java WebSocket框架及Netty-socket.io应用实战

Netty是由JBOSS提供的一个Java开源框架,它是一个高性能的网络应用程序框架,用于快速开发可维护的高性能协议服务器和客户端。Netty的设计理念是"简单、快速、强大",它的特点主要集中在:高效性:Netty使用了先进的IO事件通知机制和缓冲区复用技术,大大提高了网络通信性能。易于使用和扩展:Netty提供了丰富的API以及大量的编解码器,降低了开发复杂网络应用的门槛。稳定性和可靠性:Netty提供了强大的异常处理和优雅的资源管理机制,确保了长连接和高并发场景下的稳定性。

weixin_42356162的博客 1400

Socket的重要性

Socket不仅在聊天应用程序中需要用到,而且对于学习Asp.net也非常有帮助。你懂得!      实现服务端和客户端互发信息,以及服务端向多个客户端发送信息。      服务端代码1: public Form1() { InitializeComponent(); Control.CheckForIllega

陈晖ToDo 975

C# winform TCP-IP 服务端 可实现一个IP地址多端口号同时启动服务

这是一个基于C# winform TCP-IP 服务端程序。可实现一个IP地址多端口号同时启动服务。包含创建TCP-IP服务、监听客户端反馈的消息、处理并回复消息给客户端。

Thread 执行无参,一个参数、多个参数的方法

/通过实例化对象将方法传给线程,同时也通过Person类的构造函数将两个String参数传递给s2。SayHelloToXiaohouye,在这个方法里声明一个变量,并输出.这就构成了最简单的多线程的例子,一般情况下,我们都是用这个的。//给方法s1传参,并将线程设置为待启动状态。ThreadStart这个委托定义为void ThreadStart(),也就是说,所执行的方法不能有参数。在多线程类中实例化Person的对象,将s2需要的2个参数变量传入ThreadStart对象。t.Start();

OKMZY的专栏 889

测试人必看!正交表与Allpairs工具对比:如何选择最适合你的组合测试方案?

本文深入对比了正交表、PICT与Allpairs三种主流组合测试方案,帮助测试人员根据项目场景做出最佳选择。文章分析了各自的核心原理、优劣势及适用场景,特别强调了在涉及复杂约束时PICT工具的强大功能,并提供了从原理学习到CI/CD集成的实战选型指南。

weixin_29224309的博客 267

小程序 video 控制器外观调整_Kessil 360X Tuna Sun无线控制器使用分享

之前分享了Kessil 360X Tuna Sun开箱记录,时间关系,没来得及使用WiFi Dongle无线控制器。昨晚抽空实操了一下,做个操作记录,希望对大家有参考Kessil无线模块操作指南官方视频英文教程配中文字幕,非常详尽语速较快,重点位置可以暂停操作点击边框调出视频工具条1、拆包取控制器,保存二维码Kessil WiFi Dongle包装打开包装就能看到Kessil无线控制模...

weixin_39759060的博客 4733

机器人Socket通信及实战应用

任务需求 现有工业视觉相机,通过利用Socket通信使相机和机器人相连接,任意旋转待检测物体后,相机拍照即可识别出物体的位置,视觉相机检测物体的位置通过Socket发送给机器人端,机器人根据发送过来的数据完成对被检测到物体的上表面轮廓“边缘”运动,工作站布局如图1- 1所示。 图1- 1工作站布局 软件工具 Socket调试工具:TCP客户端-小陆课堂 ABB机器人仿真软件:RobotStudio6.08 知识准备 本任务利用

luhaibini的博客 8845

rv1126 SDK编译【2020-0912版本SDK包】

rv1126 sdk 编译

学习记录 1万+

socket介绍

Socket: socket本质是编程接口(API),对TCP/IP的封装,TCP/IP也要提供可供程序员做网络开发所用的接口,这就是Socket编程接口;HTTP是轿车,提供了封装或者显示数据的具体形式;Socket是发动机,提供了网络通信的能力。在Internet上的主机一般运行了多个服务软件,同时提供几种服务。每种服务都打开一个Socket,并绑定到一个端口上,不同的端口对应于不同的服务 1、网络中进程之间如何通信? TCP/IP协议族来处理,网络层的“ip地址”可以唯一标识网络中的主机,而传输层的“

许嵩不爱吃土豆的博客 2890

Informer复现 -- 完整模型

有了数据和核心的ProbAttention,接下来就可以复现完整的Informer(图1)了。图1:Informer模型结构[1]如果对图1还不太熟悉的同学,可以参考图2。由图2可知,informer与Transformer之间的差异并不大。主要区别是ProbAttention和可能的encoder最后一层的conv(源代码中用来distil)。图2:参考Transformer画的Informer模型结构。

AI_daily的博客 3492

通过python下载西门子技术中心文档

本篇文章纯粹记录如何下载通过python下载西门子技术中心文档,所下载文档完全自己学习使用,非商业用途

John_09040211的博客 561

基于Socket(1)

都说三年是程序员的一个坎,能否晋升或者提高自己的核心竞争力,这几年就十分关键。技术发展的这么快,从哪些方面开始学习,才能达到高级工程师水平,最后进阶到Android架构师/技术专家?我总结了这 5大块;我搜集整理过这几年阿里,以及腾讯,字节跳动,华为,小米等公司的面试题,把面试的要求和技术点梳理成一份大而全的“ Android架构师”面试 PDF(实际上比预期多花了不少精力),包含知识脉络 + 分支细节。Java语言与原理;大厂,小厂。Android面试先看你熟不熟悉Java语言高级UI与自定义view。

2401_84132393的博客 925

树莓派 5 AI 套件(Hailo)示例

该用户自定义类作为输入传递给回调函数,该函数在管道输出上运行。它用于主程序与回调函数之间的通信。它对 hailo_rpi_common::app_callback_class 进行了扩展,并可根据应用程序的具体情况定制附加变量和方法。

机器人控制与仿真应用 4115

以教案的方式进行整理技术点的:NIO与Socket编程技术

a、NIO与原来的IO有同样的作用和目的,但是使用的方式完全不同,NIO支持面向缓冲区的、基于通道的IO操作。NIO将以更加高效的方式进行文件的读写操作。b、NIO系统的核心在于通道(Channel)和缓冲区(Buffer)。通道表示打开到 IO 设备(例如:文件、套接字)的连接。若需要使用 NIO 系统,需要获取用于连接 IO 设备的通道以及用于容纳数据的缓冲区。然后操作缓冲区,对数据进行处理。

知识分享官 406

【部署】OpenClaw版本降级实操(含全量卸载)

本文详细介绍了OpenClaw工具的降级与卸载方法。主要内容包括:1)通过npm安装指定版本的核心命令及国内镜像加速方案;2)两种卸载路径:CLI工具存在时的简易一键卸载(含交互式与非交互式命令)和手动分步卸载流程;3)CLI已删除但服务仍在运行时,针对macOS(launchd)、Linux(systemd)和Windows(计划任务)系统的具体清理步骤。文章特别强调了卸载前备份的重要性,并提供了不同安装方式(常规安装与源码克隆)的额外说明,确保用户能彻底清理所有组件。

海兰 3173

【四足机器人项目实战】MIT无刷电机FOC硬件电路设计

系列文章目录 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 TODO:写完再整理 文章目录系列文章目录前言一、MCU最小系统--STM32F446RE1.usb串口通讯连接口+程序下载连接口2.MCU电源滤波二、磁编码器角度传感器三、三相驱动桥四、CAN通讯收发器电路五、温度ADC检测六、电源滤波及分压电路1、DC电源输入端2、DC电源滤波电路3、DC电源分压电路4、三相绕线接线端总结参考资料 前言 认知有限,望大家多多包涵,有什么问题也希望能够与大家多交流,共同成长! 本文先对

qq_35635374的博客 7062

Java网络编程:Socket与HttpURLConnection的深度博弈

通过本文的讲解,你已经掌握了Java网络编程中Socket和HttpURLConnection的使用场景、实现原理以及性能对比。在实际开发中,合理选择这些API可以显著提升应用的性能和用户体验。Socket适用于需要底层控制的场景,而HttpURLConnection适用于需要处理HTTP协议的场景。在实际项目中根据需求选择合适的网络编程API。学习和探索更多的网络编程高级技巧,如NIO和多线程服务器。阅读和分析优秀的Java网络项目,学习如何在实际项目中应用这些技术。

司徒鸿的博客 971

visio安装包

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

Java入门预科阶段

1.学编程!=程序员,编程是一种基本技能,编程是逻辑思维的表达 2.CTO技术总监 技术+管理, 资深码农/架构师 纯技术 项目经理 技术+商务谈判 CEO敢冒险 3.学习改变人,学习改变命运 4.转行的情况 年龄因素 家庭因素 行业相关度 种树的时间,最好是十年前,其次是现在 5.C语言在底层编程,嵌入式、病毒开发等应用,可以代替汇编语言开发...

pangbinlalala的博客 301

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

架构师养成记

那么要成为架构师的途径似乎只有现在较为流行的软件学院和个人自我培养了。关于软件学院我接触过不少,其宗旨绝大部分都是造就(or打造)企业需要的软件架构师(or程序员or人才)。教师来源与企业、学员来源与企业、人才输送到企业是他们办学的手段。尽管各个如雨后春笋般出现的软件学院口号差不多,但恐怕大多只是为了圈钱卖学位了事... 架构师不是通过理论学习可以搞出来的,不过不学习相关知识那肯定是不行的。参

legend_x的专栏 1078

VB摄像头监控

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

Java ServerSocket和Socket编程的经验和教训

  Java的ServerSocket和Socket是开发网络应用程序的基础。ServerSocket和Socket类是java自带的,(java.net.ServerSocket和java.net.Socket)。     我不打算再重复叙述Java文档中关于这两个类的描述,只是想把使用者两个类中的一些经验写下来。   ServerSocket 的队列长度   ServerS...

windshome的博客 208

架构师之路(转贴)

架构师之路(转贴) 架构师(Architecture)是目前很多软件企业最急需的人才,也是一个软件企业中薪水最高的技术人才。换句话说,架构师是企业的人力资本,与人力资源相比其能够通过架构、创新使企业获得新的产品、新的市场和新的技术体系。那么什么是架构师、架构师的作用、如何定位一个架构师和如何成为一个架构师呢?这是许多企业、许多程序员朋友希望知道的或希望参与讨论的话题内容。 所谓架...

shonghuanc的专栏 138

如何成为软件架构师

那么要成为架构师的途径似乎只有现在较为流行的软件学院和个人自我培养了。关于软件学院我接触过不少,其宗旨绝大部分都是造就(or打造)企业 需要的软件架构师(or程序员or人才)。教师来源与企业、学员来源与企业、人才输送到企业是他们办学的手段。尽管各个如雨后春笋般出现的软件学院口号差

hunter4ever的专栏 484

Java WebSocket框架_java websocket 框架,java面试题大汇总云栖社区

我想问下大家当初选择做程序员的初衷是什么?有思考过这个问题吗?高薪?热爱?既然入了这行就应该知道,这个行业是靠本事吃饭的,你想要拿高薪没有问题,请好好磨练自己的技术,不要抱怨。有的人通过培训可以让自己成长,有些人可以通过自律强大的自学能力成长,如果你两者都不占,还怎么拿高薪?架构师是很多程序员的职业目标,一个好的架构师是不愁所谓的35岁高龄门槛的,到了那个时候,照样大把的企业挖他。为什么很多人想进阿里巴巴,无非不是福利待遇好以及优质的人脉资源,这对个人职业发展是有非常大帮助的。

2401_84418883的博客 885
上一篇: 成功“拿捏”金三银四 汇总2022Java面试突击班后的面试小册
下一篇: 你真的能在JAVA开发这条路上面一直坚持下去吗?
python88889
博客等级 码龄5年 15粉丝 55原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值