多文件自平衡云传输(四)资源发送端 —————— 开开开山怪

多文件自平衡云传输(二)资源接收 断点续传篇 —————— 开开开山怪 多文件自平衡云传输(二)资源接收端篇 资源接收端从请求到接收的过程 1.资源接收端启动时先与拥有资源的服务器(可以是APP服务器,也可以是拥有资源的服务器)进行短连接进行资源资本信息的获取。 2.根据获取的资源的信息中的资源的名称进行短连接资源注册中心,请求拥有资源的节点列表 3.根据资源基本信息中的资源的多个文件的基本信息进行本地资源的查询,若本地拥有该资源(之前可能进行过请求保存到本地),进行... 阅读详情


在这里插入图片描述
资源发送端的功能
1.注册资源
2.注销资源
3.资源发送

对于注册资源和注销资源来说这两大功能一直都是资源提供者所实现的,资源发送端应用了资源提供者的功能,并且自身又进行了资源发送功能的扩展。

Provider

/*
*资源提供者:专注于资源的注册和注销的功能
*/
public class Provider {
	private rmiCilent rc;
	private static int PORT = 54200;
	private static String IP = "192.168.230.1";
	private CilentProxy cp;
	private int RegisterPort = PORT;
	private String RegisterIp = IP;
	private static NetNode self = new NetNode();
	
	static {
		self.setIp(getSelfIp());
		self.setPort(54188);
	}
	public Provider() {
		this.RegisterIp = IP;
		this.RegisterPort = PORT;
		this.cp = new CilentProxy();
		this.rc = new rmiCilent();
		this.rc.setId(RegisterIp);
		this.rc.setPort(RegisterPort);
		this.cp.setRmicilent(this.rc);	
	}
	public void setPort(int selfPort) {
		self.setPort(selfPort);
		
	}
	public int getPort() {
		return self.getPort();
	}
	/*
	*注册单项服务
	*/
	public void register(String name) {
		List<String> list = new ArrayList<String>();
		list.add(name);		
		IRegister ir = cp.getProxy(IRegister.class);//进行短连接注册中心,进行注册
		ir.registServer(self, list);
		
	}
	/*
	*注销本地服务
	*/
	public void LogoutResource() {	
		IRegister ir = cp.getProxy(IRegister.class);
		ir.logOutServer(self);	
	}
	/*
	*注册多项服务
	*/
	public void registeAll(List<String> nameList) {
		IRegister ir = cp.getProxy(IRegister.class);//进行短连接注册中心,进行注册
		ir.registServer(self, nameList);
		
	}
	public static String getSelfIp() {
		try {
			InetAddress address = InetAddress.getLocalHost();
			String ip = address.getHostAddress();
			return ip;
		} catch (UnknownHostException e) {
			e.printStackTrace();
		}
		return null;
	}

}

SenderServer

/*
*可以直接进行使用的资源接收端的入口类
*提供注册和注销资源的调用方法供用户使用
*/
@rmiInterface(rmiter = Isender.class)
public class SenderServer implements Isender{

	private rmiServer sr;//作为短连接的服务器端,用于进行本地资源的发送
	private ResourcePool rp;
	private Provider provider;
	
	
	public SenderServer() {
		provider = new Provider();		
		rp = new ResourcePool();//对于这个ReourcePool来说,用于发送端存储提供给接收端的资源
		sr = new rmiServer();

	}
	public void setPort(int port) {
		provider.setPort(port);
	}
	
	public void start() {		
		sr.setPort(provider.getPort());
		sr.start();
		
	}
	public void RegisteResource(String name) {
		provider.register(name);
	
	}
	/*
	*将默认路径上的所有资源都进行注册
	*/
	public void registeAllResource() {		
		//在此之前发送端已经进行设置默认的本地需要注册资源的路径		
		Set<String> resourceList = rp.getResourceName();
		List<String> list = new ArrayList<String>();
		for(String one : resourceList) {
			list.add(one);
		}
		provider.registeAll(list);

	}
	public void LogoutResource() {
		provider.LogoutResource();
	}
	/*
	*将本地拥有的资源基本信息存在本地缓存中
	*存储单项资源基本信息
	*/
	public void addResource(String resourceName) {
		rp.addResource(resourceName);
		//发送端将本地的资源存储到发送端缓存中
	}
	/*
	*用户设置需要在缓存中存储本地下哪个目录下的资源
	*resourceRoot表示为资源根目录
	*之后可直接通过资源的名称可以直接将本地资源的基本信息存入缓存
	*/											
	public void setResoureRoot(String resourceRoot) {//先将注册的资源进行整理
		rp.setLocalRoot(resourceRoot);
	}

/*
*响应接收端短连接响应的方法
*开启发送线程,链接接收端,并且进行片段发送
*/
	@Override
	public void send(NetNode receive, ResourceInfo ri) {
		
		senderDetail sd = new senderDetail(receive, ri, rp);		
		new Thread(sd).start();	
	}

}

SenderDetail

资源发送端真正的资源发送的管理类。

public class SenderDetail implements Runnable{
	//对于一个发送端来说事实上是一个短连接的过程,一次发送
	private NetNode receive;
	private Socket socket;
	private DataOutputStream dos;
	private ResourceInfo ri;
	private Map<String, RandomAccessFile> rafPool;
	private RandAccessFilePool rfp;
	private ResourcePool rcp;
	
	public SenderDetail(NetNode receive, ResourceInfo ri,ResourcePool rp) {
		this.receive =receive;
		this.rcp = rp;
		rafPool = new HashMap<String, RandomAccessFile>();
		String root = rp.getResourceInfo(ri.getResourceName()).getRoot();
		this.ri = ri;//得到的为接收端发过来的资源,需要对本地的目录进行更改
		this.ri.setRoot(root);
		rfp = new RandAccessFilePool();

	}
	
	@Override
	public void run() {
		connectServer();
		send();
		close();

	}
	private void connectServer() {	
			try {
				socket = new Socket(receive.getIp(), receive.getPort());
				dos = new DataOutputStream(socket.getOutputStream());
			} catch (UnknownHostException e) {
				e.printStackTrace();
			} catch (IOException e) {
				e.printStackTrace();
			}

	}
	
	private void send() {
	
		String root = this.ri.getRoot();
		List<FileHead> headList = ri.getFileHeadList();
		Map<Integer, FileInfo> fileInfoMap = ri.getFileInfoMap();
		int i;
		for( i = 0; i < headList.size(); i++) {
			FileHead fh = headList.get(i);
			String address = root + fileInfoMap.get(fh.getFileHandle()).getFileRoot();
			RandomAccessFile raf;
			
			try {
				raf = rfp.getReadRaf(address);
				int size = fh.getSectionLength();
				byte[] bytes = new byte[size];
				
				raf.seek(fh.getOffset());
				raf.read(bytes);
				
				TransferDetail td = new TransferDetail();
				td.writeBytes(dos, fh.getHeadBytes());
				td.writeBytes(dos, bytes);

			} catch (FileNotFoundException e1) {
				e1.printStackTrace();
			} catch (IOException e) {
				e.printStackTrace();
			}
			
		}		
		closeFile();	

	}
	
	private void close() {
		try {
			if (dos != null) {
				dos.close();
			}
		} catch (IOException e) {
		} finally {
			dos = null;
		}
		try {
			if (socket != null && !socket.isClosed()) {
				socket.close();
			}
		} catch (IOException e) {
		} finally {
			socket = null;
		}
	}
	
	private void closeFile() {
		for (RandomAccessFile raf : rafPool.values()) {
			try {
				raf.close();
			} catch (IOException e) {
			}
		}
	}
}

ResourcePool.

资源发送端的本地缓存,将本地磁盘的资源的基本信息进行缓存,减少了不必要的IO操作,节省了系统资源,加快了访问速度。

public class ResourcePool {
//对于每个发送端来说,都要自己的一个本地资源库
	private static final Map<String, ResourceInfo> resourcePool = new HashMap<String, ResourceInfo>();;
	private static final String DEFAULT_LOCAL_ROOT = "E:\\KSG\\";//每个发送端应该明确自己的资源默认的根路径
	private String LocalRoot = DEFAULT_LOCAL_ROOT;//有默认值,但是发送端可以进行设置
	//在这里仅仅表示的是服务器端资源的根路径	
	public ResourcePool() {	
		
	}
	//通过查找本地路径生成这个map,
	public String getLocalRoot() {
		return LocalRoot;
	}

	public void setLocalRoot(String localRoot) {
		LocalRoot = localRoot;
	}

	public void addResource(String resourceName) {
	     //例如这里使用输入QQ类似的民称
		//则应该在"E:\\KSG\\QQ"这个文件下进行资源的查找,形成ResourceInfo,并且在
		//resource中的root就是E:\\KSG,那么接收端收到相关的resource之后,需要将root改为
		//自定义的root,因为当接收端拥有完整的资源后,接收端可能变为下一个发送端,它在发送的时候
		//也需要确定自己的root,
		//TODO 根据路径进行多个文件的查找组成一个文件的map,并且构造出resource
		String findAdress = LocalRoot + resourceName;//发送端拥有资源的本地全称
		ResourceInfo ri = new ResourceInfo();
		ri.setResourceName(resourceName);
		ri.setRoot(LocalRoot);
		ri.setVersion(0);
		//根据资源的路径,得到资源的一些信息,因为一个资源包括很多文件,或者是目录,那么需要
		//将资源的左右文件记录在案,并且需要知道每个文件的具体的一些信息,长度,相对路径
		makeResource(findAdress, ri, resourceName);			
	}
	
	public void makeResource(String address, ResourceInfo ri, String ResourceName) {
		File file = new File(address);
		if(!file.exists()) {//表明资源文件地址错误或没有
			return;
		}
		
		File[] files = file.listFiles();
		for(int i = 0; i < files.length; i++) {
			File currentfile = files[i];
			if(currentfile.isFile()) {
				String currentPath = files[i].getAbsolutePath();
				//fileINfo用来描述的是资源下每一个文件的的具体信息
				//包括文件的相对地址,文件的长度,因为这是为后期在资源的传送的时候确保完整的一个条件
				FileInfo fi = new FileInfo();
				//得到当前的相对路经
				fi.setFileRoot(currentPath.replace(LocalRoot, ""));//相对路径为当前路径去掉绝对路径
				fi.setFileLength(currentfile.length());
				int fileHash = fi.hashCode();
				//设置每个文件的句柄,每个文件的句柄采用的是文件的相对路径和文件的长度进行衡量
				fi.setFileHandle(fileHash);
				ri.addFileInfo(fileHash,fi);
				resourcePool.put(ResourceName, ri);
			
			}else {
				String name = files[i].getName();
				String path = address + "\\" + name;
				makeResource(path, ri, ResourceName);
			}		
		}	
	}
	public ResourceInfo getResourceInfo(String ResourceName) {
		return resourcePool.get(ResourceName);
	}
	
	public Set<String> getResourceName(){
		return resourcePool.keySet();
	}
}
VLOOKUP_fixed.py 立即下载

相关推荐

D打卡签到,蓝牙中继,广播信号模拟器

模拟WIFI或蓝牙,有如下4种运行模式 1、WIFI模式:指定SSID、BSSID名称等,模拟WIFI,供设备连接。 2、蓝牙静态模式:指定MAC地址,广播固定的RAW数据。 3、蓝牙动态主机模式:扫描周围蓝牙设备,获取指定MAC地址的蓝牙及其RAW数据,实时发送至Cloud云端,可以设定时间段,只在设定的时间段内发送。 4、蓝牙动态从机模式:指定MAC地址,从Cloud云端获取动态主机模式实时上传的该MAC地址的RAW数据,并广播RAW数据。 准备工作: 1、板子:选择ESP32C3或ESP32C3 Supermini 2、nRF Connect手机app:用于扫描获取待模拟蓝牙设备的MAC和RAW数据。 Wifi分析仪或WiFi魔盒手机APP:用于扫描获取待模拟WIFI设备的SSID和BSSID。 3、可使用官方flash_download_tool_3.9.11工具来固件烧录。 使用说明: 上述完成后,设备首次上电,RESET一侧的指示灯会常亮,可以把它理解成电源指示灯; BOOT一侧的灯会亮,该灯常亮,表示设备开启了AP模式,此时设备会发射一个WIFI信号源,名称为ESPWIFI_AP,密码为12345678,手机或电脑连接该WIFI,浏览器输入192.168.4.1,进入设备的配置页面,进行相应的配置,其中动态主机模式和动态从机模式的SSID、Pwd 及要模拟的蓝牙MAC地址。配置完成并保存后,会重启,重启后设备会按照保存的配置运行。若下次要修改设备配置,可以长按BOOT按键,等待BOOT一侧的灯常亮,即进入AP模式,再按照上述流程配置即可。 仅用于蓝牙设备的开发与调试,请勿用于签到等违法违纪用途。

多文件自平衡云传输 (一) 资源篇 —————— 开开开山怪

多文件自平衡云传输(一) 传统的客户端和服务端来说,客户端面对的是单一的服务器, 服务器及网络的带宽决定了网络的性能,每台服务器提供的信息数量,受到自身存储空间的限制,而任意时刻它所能支持的客户端的访问数量,则受到自身处理能力和网络带宽的限制,一旦服务器崩溃,整个网络也随之瘫痪。 对于服务器来说,当拥有大量的客户端进行访问的时候,服务器将承受巨大的压力。 对我们的多文件传输来说,我们的客户端想要请...

String_guai 501

YOLO26算法心电图十二导联目标检测+训练好的模型+368张数据集+pyqt可视化界面.zip

附训练好的 YOLO 权重与 PyQt 可视化检测界面,页面底部含可视化效果预览,毕设/课设开箱即用。 【数据集概况】 · 检测类别(中文):[导联I(I), 导联II(II), 导联III(III), 胸导联V1(V1), 胸导联V2(V2), 胸导联V3(V3), 胸导联V4(V4), 胸导联V5(V5), 胸导联V6(V6), 加压肢体导联aVF(aVF), 加压肢体导联aVL(aVL), 加压肢体导联aVR(aVR)] · 训练集:313 张 · 验证集:37 张 · 测试集:18 张 · 总计:368 张 该数据集聚焦于临床心电图信号的精准识别与定位,其核心检测目标为标准12导联心电图中的各个独立导联波形区域,涵盖肢体导联(I、II、III)与加压肢体导联(aVR、aVL、aVF),以及胸前导联(V1至V6),适用于心电图自动分析系统中对各导联位置的快速准确标注与分类。数据采集场景真实还原了医院心电图室或急诊监护环境下的标准心电图记录纸,波形清晰、基线稳定,具有高度临床参考价值。... 【训练曲线与评估图】 【模型训练配置】 参数 | 值 模型 | yolo26n 训练轮数 | 100 epochs 输入尺寸 | 640x640 批次大小 | 24 优化器 | auto 初始学习率 | 0.01 训练设备 【关键指标汇总】 训练了 57 个 epoch,最终轮指标: 指标 | 数值 mAP50 | **0.9708** mAP50-95 | 0.6344 Precision | 0.8990 Recall | 0.9191 train/box_loss | 1.2231 train/cls_loss | 0.9703 val/box_loss | 1.2779 val/cls_loss | 0.... 使用场景:毕业设计、课程设计、深度学习入门、工业场景落地验证。

多文件自平衡云传输(三)节点选择和资源分配 —————— 开开开山怪

多文件自平衡云传输(三)节点选择和资源分配

String_guai 570

企业级AI助手平台 开箱即用的全栈AI平台,支持多智能体协同、Supervisor模式编排、多种决策模式、RAG技术和流程编排能力 支持多厂商大模型统一接入与管理,安全可控的企业知识库与高精度检索优化

企业级AI应用开发框架,支持多厂商大模型统一接入与管理,安全可控的企业知识库与高精度检索优化能力,提供可视化流程编排、自主决策智能体与多智能体协同调度,兼容主流 Agent Skill 协议,帮助企业与开发者零门槛快速构建安全、高效、可落地的AI智能体应用与行业解决方案。

Java低代码, 轻量级, 支持国产化 国密 AI大模型MCP服务 商业免费 包括核心模块如:组织机构、角色用户、权限授权、数据权限、内容管理、工作流、Spring Cloud 微服务、AI大模型等

Java低代码, 轻量级, 支持国产化 国密 AI大模型MCP服务 商业免费 Spring Boot, MyBatis, Flowable, TypeScript, Vue, Antdv, 包括核心模块如:组织机构、角色用户、权限授权、数据权限、内容管理、工作流、Spring Cloud 微服务、AI大模型、代码生成器等

多文件自平衡云传输 (五)资源管理中心篇 —————— 开开开山怪

多文件自平衡云传输 (五)资源注册中心篇

String_guai 392

文创媒体电商行业智算中心(AIDC)建设规划方案.pptx

文创媒体电商行业智算中心(AIDC)建设规划方案.pptx

多文件自平衡云传输 (六)番外篇 —————— 开开开山怪

多文件自平衡云传输 (六)番外篇

String_guai 450

集团企业数字化转型AI智能体平台规划及场景应用方案.pptx

集团企业数字化转型AI智能体平台规划及场景应用方案.pptx

【运维自动化】shell脚本自动化运维示例2

内容概要:本文介绍了shell脚本在自动化运维中的实际应用,重点展示了一个批量远程执行命令与文件分发的典型场景。通过编写健壮的Shell脚本,实现对多台服务器并行执行指定命令(如磁盘使用情况查询),并集成错误处理、超时控制和并发管理机制,提升运维效率与系统稳定性。脚本采用set -euo pipefail增强容错能力,利用SSH免密登录和xargs并行处理实现高效批量操作,同时强调在受控内网环境中运行以保障安全。; 适合人群:具备Linux系统基础和Shell编程经验,从事运维、DevOps或后端开发工作1-3年的技术人员。; 使用场景及目标:①用于批量服务器状态检查、配置同步、日志收集等日常运维任务;②帮助理解自动化脚本设计中的健壮性要素(如错误捕获、并发控制、安全性考虑)并应用于生产环境。; 阅读建议:此资源提供可直接修改复用的实用脚本范例,建议结合自身运维环境进行适配测试,重点关注SSH安全配置、并发参数调优及异常输出捕获,确保在真实部署中稳定可靠。

基于MPC的风储联合调频模型研究(Simulink仿真实现)

内容概要:本文系统研究了基于模型预测控制(MPC)的风能与储能系统联合频率调节模型,并通过Simulink工具实现了完整的仿真验证。文章深入剖析了风储联合系统的整体架构设计,详细阐述了MPC控制器的建模原理及其在电网频率调节中的具体应用机制,重点探讨了系统在应对负荷突变与风电功率波动等典型扰动下的动态响应特性与控制性能表现。通过与传统控制策略的仿真实验对比,充分验证了所提出的MPC方法在提升电网频率稳定性、抑制频率偏差方面的显著优越性,并进一步分析了控制器关键参数对系统整体性能的影响规律,为高性能控制策略的设计提供了理论依据。; 适合人群:具备电力系统分析、自动控制理论基础,熟练掌握Simulink/Matlab仿真环境,从事新能源并网、电力系统稳定控制、储能系统集成与优化等相关领域的研究生、科研人员及工程技术人员。; 使用场景及目标:①应用于高比例可再生能源接入背景下电网频率调节的关键技术研究;②为风储联合系统的规划、设计与运行优化提供先进的控制策略参考;③作为模型预测控制在电力系统领域应用的经典教学案例,深化对MPC预测机制、滚动优化与反馈校正等核心原理的理解与实践能力。; 阅读建议:建议读者结合提供的Simulink仿真模型进行同步操作与验证,重点关注MPC控制器的状态空间建模、预测时域设定、代价函数构建及参数整定过程,通过对比不同工况与参数配置下的仿真结果,深入理解风储系统协同调频的作用机理与MPC控制的优势所在。

数字政府一网通办及一网协同AI智能体平台规划方案.pptx

数字政府一网通办及一网协同AI智能体平台规划方案.pptx

数据驱动复杂网络的数据驱动控制(Matlab代码实现)

内容概要:本文系统介绍了《【数据驱动】复杂网络的数据驱动控制(Matlab代码实现)》这一技术资源,聚焦于复杂网络系统中基于数据驱动的先进控制方法,依托Matlab平台实现建模、仿真与控制策略开发。内容深入涵盖数据驱动控制的核心原理、Koopman算子理论在非线性系统线性化中的应用、机器学习与动态系统建模的融合机制,以及如何在无需精确物理模型的前提下,利用观测数据构建高效控制器。资源提供了完整的Matlab代码实例,覆盖从数据采集、特征提取、模型辨识到控制器设计与性能评估的全流程,突出在电力系统、智能电网、工业自动化等典型复杂网络场景下的应用潜力与工程可行性。; 适合人群:具备一定Matlab编程能力与自动控制理论基础的研究生、科研人员及工程技术人员,尤其适用于从事数据驱动控制、复杂网络建模、智能优化与系统辨识等方向的高校师生和研发工作者。; 使用场景及目标:① 深入理解数据驱动控制在复杂网络中的理论基础与实现路径;② 借助配套Matlab代码快速搭建仿真环境,开展算法验证与性能对比;③ 应用于电力系统稳定性控制、可再生能源集成、工业过程监控等实际工程问题的研究与优化;④ 支撑高水平学术论文撰写、EI/SCI期刊成果复现与科研项目申报。; 阅读建议:建议读者结合文档中的理论推导与代码实现逐项调试运行,深入剖析Koopman算子、模型预测控制(MPC)等关键算法的实现细节;鼓励在现有代码基础上进行参数调整、模型拓展与创新性改进,强化理论与实践的深度融合,提升科研创新能力。

基于动态窗口法DWA的机器人路径规划研究(Matlab代码实现)

内容概要:本文系统研究了基于动态窗口法(DWA)的机器人局部路径规划算法,深入剖析其在动态环境中实现自主避障与实时轨迹优化的核心机制。文章详细阐述了DWA算法的速度空间采样策略、轨迹预测模型、动力学约束处理及多目标代价函数的设计原理,并通过构建完整的Matlab仿真框架验证算法有效性。结合典型场景的仿真实验,展示了机器人在复杂障碍物环境下如何实时生成安全、平滑且符合运动学约束的最优路径,充分体现了DWA在移动机器人导航中的实用性与鲁棒性。; 适合人群:具备机器人运动规划基础知识和Matlab编程能力,从事智能移动机器人、自动驾驶或服务机器人研发的研究生、科研人员及工程技术人员。; 使用场景及目标:①深入理解DWA算法的理论基础与实现细节;②掌握机器人局部路径规划的仿真实现方法;③为实际机器人系统的导航模块开发提供可复用的算法原型与代码参考;④作为进一步研究高级导航算法(如TEB、MPC)的技术基础。; 阅读建议:建议结合提供的Matlab代码逐模块分析与调试,重点关注速度采样、轨迹积分、障碍物距离计算及代价评估等关键环节,通过调整参数在不同地图环境中进行对比实验,以深刻把握算法性能与参数之间的关系,进而提升对实时路径规划系统设计的理解与应用能力。

【轴承故障诊断】用于轴承故障诊断的集中时频分析研究(Matlab代码实现)

内容概要:本文系统研究了用于轴承故障诊断的集中时频分析技术,重点解决了传统时频分析方法在处理非平稳信号时存在的能量分散与分辨率不足等问题。通过引入集中时频分析方法,能够有效聚焦信号能量,精确提取轴承故障特征频率,提升故障识别的准确性与时效性。文章详细阐述了该方法的理论基础,并结合仿真信号与实际实验数据验证其优越性能,同时提供了完整的Matlab代码实现流程,涵盖信号预处理、时频变换、参数优化及结果可视化等环节,便于读者复现与拓展应用。; 适合人群:具备一定信号处理理论基础和Matlab编程能力的研究生、科研人员,以及从事机械设备状态监测、故障诊断与预测性维护工作的工程技术人员。; 使用场景及目标:①应用于电机、风机、齿轮箱等旋转机械的早期轴承故障检测,实现故障预警;②提升工业设备运维系统的智能化水平,支撑预测性维护体系构建;③作为高校或研究机构在信号处理、机械故障诊断等课程中的教学案例与实践素材。; 阅读建议:建议读者结合文中提供的Matlab代码逐段运行与调试,深入理解集中时频分布的生成机制及其关键参数(如核函数选择、平滑窗口大小)对诊断效果的影响,并尝试将其应用于其他类型的机械故障信号分析中,开展对比研究以深化对该方法适用性的认识。

(Multisim课设资料)最全面函数信号发生器(三角波+正弦波+方波信号+锯齿波仿真设计+报告文档

(Multisim课设资料)最全面函数信号发生器(三角波+正弦波+方波信号+锯齿波仿真设计+报告文档

2024 《计算机网络》实验教学指导书.doc

2024 《计算机网络》实验教学指导书.doc

上一篇: 多文件自平衡云传输(三)节点选择和资源分配 —————— 开开开山怪
下一篇: 多文件自平衡云传输 (五)资源管理中心篇 —————— 开开开山怪
开开开山怪
博客等级 码龄8年 41粉丝 30原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值