【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

Discrete Optimization (Coursera) 学习笔记 Week 1 introduction (开个帖子)

Week 1 Introduction 这位教授Pascal Van Hentenryck 真的算是优化领域神级别的人物了吧?截一张Google scholar的图大家感受一下… 居然在Coursera上看到了他开的课:Discrete Optimization。试听了几节后,发现讲得很有激情,而且深入浅出。遂决定花暑假跟完这一门课。 这门课每周花两三个小时介绍基础概念,然后得花十几个小时写作业(coding)… 一开始以为Coursera上的课的作业应该不会太难,然后第一次作业(knapsack)我就被

ZJ_11701的博客 656

新手必看:SMIC 0.18um PDK安装保姆级教程(附Cadence IC617环境配置)

本文提供SMIC 0.18um PDK在Cadence IC617环境下的详细安装教程,涵盖环境准备、文件解压、安装脚本运行、环境变量配置及Cadence集成验证等关键步骤,特别针对初学者常见问题提供解决方案,助力快速掌握芯片设计工具配置。

weixin_30522183的博客 491

机器人Socket通信及实战应用

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

luhaibini的博客 8845

电力远动入门:手把手解析IEC 60870-5-101规约的帧结构与报文交互(基于DL/T634.5101-2002)

本文深入解析IEC 60870-5-101规约的帧结构与报文交互,适用于电力远动通信系统。通过详细讲解规约的基础架构、控制域位定义及典型报文交互流程,帮助工程师快速掌握101规约的核心技术,提升电力自动化系统的调试与维护能力。

weixin_27076351的博客 244

socket介绍

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

许嵩不爱吃土豆的博客 2890

【基于51】红外寻迹智能小车 - 代码篇

这是一个基于C51单片机的红外巡线智能小车,是一个适合嵌入式单片机、C语言初学者练习的小Demo,文章提供完整的项目思路、免费的源代码。

ZER00000001的博客 3万+

多后端系统统一聚合与智能分流:用 Multi Origin Composition 与 Routing 打造一套可扩展的 SAP Gateway 架构

本文针对企业级SAP集成场景,详细介绍了如何利用SAP Gateway的MOC(多源组合)和Routing功能实现多后端系统的智能路由与数据聚合。通过系统别名配置、用户角色绑定和主机名分流等机制,可实现按用户、按域名的精确路由。文章还提供了配置清单、性能优化建议和常见问题解决方案,帮助工程师落地多后端OData服务的最佳实践。

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

基于Socket(1)

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

2401_84132393的博客 925

YOLOv8改进 | Neck篇 | Slim-Neck替换特征融合层实现超级涨点 (又轻量又超级涨点)

本文给大家带来的改进机制是Slim-neck提出的Neck部分,Slim-neck是一种设计用于优化卷积神经网络中neck部分的结构。在我们YOLOv8中,neck是连接主干网络(backbone)和头部网络(head)的部分,负责特征融合和处理,以便提高检测的准确性和效率。亲测在小目标检测和大尺度目标检测的数据集上都有大幅度的涨点效果(mAP直接涨了大概有0.4左右。同时本文对Slim-Neck的框架原理进行了详细的分析,不光让大家会添加到自己的模型在写论文的时候也能够有一定的参照。

Snu77的博客 1万+

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

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

司徒鸿的博客 971

详解Pytorch求导

本文主要详解Pytorch求导,希望能对学习Pytorch的同学有所帮助。 文章目录 1. pytorch求导问题 2. pytorch三大类求导代码示例 2.1 标量求导 2.2 向量求导&矩阵求导

weixin_43178406的博客 3073

【AUTOSAR-Nm】-2.2-通过CAN/Lin...信号报告Nm状态机的跳转

如何通过Can/Lin/Fr/Udp/J1939信号,获取每个通道对应状态机的跳转信息:“前一次状态”和“当前状态”。

「汽车电子助手」的博客 2464

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

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

知识分享官 406

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

Java入门预科阶段

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

pangbinlalala的博客 301

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

架构师养成记

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

legend_x的专栏 1078

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

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

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

windshome的博客 208

Java 面试之 IO 流及Socket,springcloud教程pdf

我们总是喜欢瞻仰大厂的大神们,但实际上大神也不过凡人,与菜鸟程序员相比,也就多花了几分心思,如果你再不努力,差距也只会越来越大。面试题多多少少对于你接下来所要做的事肯定有点帮助,但我更希望你能透过面试题去总结自己的不足,以提高自己核心技术竞争力。每一次面试经历都是对你技术的扫盲,面试后的复盘总结效果是极好的!神们,但实际上大神也不过凡人,与菜鸟程序员相比,也就多花了几分心思,如果你再不努力,差距也只会越来越大。

weixin_58134620的博客 824

架构师之路(转贴)

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

shonghuanc的专栏 138

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

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

2401_84418883的博客 885
上一篇: 【Java架构师入门到精通提升】自定义spring
下一篇: 【Java架构师入门到精通提升】Java的动态代理
蒙塔ta
博客等级 码龄5年 4粉丝 30原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值