自定义简单的(tomcat)web服务器

JAVAweb Tomcat部署web服务器(项目) web(World Wide Web)即全球广域网,也称为万维网,它是一种基于超文本和HTTP的、全球性的、动态交百的、跨平台的分布式图形信息系统。是建立在internet上的一种网络服务,为浏览者在Internet上查找和浏览信息提供了图形化的、易于访问的直观界面,其中的文档及超级链接将Internet上的信息节点组织成一个写为关联的网状结构。Web简述:可以通过http协议访问的网络服务,称为web,比如京东,天猫,淘宝等等;采用Java的相关技术栈来实现Web功能的开发。 阅读详情

  自从JSP发布之后,推出了各式各样的JSP引擎。Apache Group在完成GNUJSP1.0的开发以后,开始考虑在SUN的JSWDK基础上开发一个可以直接提供Web服务的JSP服务器,当然同时也支持Servlet, 这样Tomcat就诞生了。Tomcat是jakarta项目中的一个重要的子项目,其被JavaWorld杂志的编辑选为2001年度最具创新的java产品,同时它又是sun公司官方推荐的servlet和jsp容器,因此其越来越多的受到软件公司和开发人员的喜爱。servlet和jsp的最新规范都可以在tomcat的新版本中得到实现。其次,Tomcat是完全免费的软件,任何人都可以从互联网上自由地下载。Tomcat与Apache的组合相当完美。

      当然这次我自定义的tomcat是很简单的,只解析出普通的html页面进行响应然后回送的是字符串到浏览器,其他的css什么的自然是不不支持的,一个基于Java的web服务器用到的两个重要类:java.net.Socket和java.net.ServerSock,当然通信用的是http协议。

      好的,首先我们先新建一个tomcatServer入口类,这个类自然就是用serverSocket进行对socket的连接进行监听,然后再在线程中操作与浏览器的请求和响应:

[html]  view plain  copy
  1. <span style="font-size:18px;">import java.io.IOException;  
  2. import java.net.ServerSocket;  
  3. import java.net.Socket;  
  4. public class TomcatServer {  
  5.     /**  
  6.      * @param args  
  7.      *   
  8.      * tomcatserver一有客户端上来就监听  
  9.      * @throws IOException   
  10.      */  
  11.     public static void main(String[] args)  {  
  12.         int port=Integer.parseInt((String)WebProperties.getInstance().get("port"));  
  13.         ServerSocket ss=null;  
  14.         try {  
  15.             ss = new ServerSocket(port);  
  16.         } catch (IOException e) {  
  17.           
  18.             Utils.printException(e);  
  19.         }  
  20.         System.out.println(Utils.formatDate()+"\t服务器启动,监听"+ss.getLocalPort()+"端口");  
  21.         while(true){  
  22.             Socket s=null;  
  23.             try {  
  24.                 s=ss.accept();  
  25.             } catch (IOException e) {  
  26.                 // TODO Auto-generated catch block  
  27.                 Utils.printException(e);  
  28.             }  
  29.             System.out.println("客户端"+s.getRemoteSocketAddress()+"登陆上了服务器");  
  30.             //这是一个连接会话任务类,实现Runnable接口,网络操作需要启用线程  
  31.             //在会话任务类中  
  32.             HttpSessionTask hst=new HttpSessionTask(s);  
  33.             new Thread(hst).start();  
  34.         }  
  35.           
  36.     }  
  37. }</span>  

      浏览器此时是客户端,我们监听了一个端口,然后只要有客户端连接上来我们就要在HttpSession中对浏览器的请求做处理了,在这里我们要建一个配置文件用来定义资源文件的位置和端口号,这样就可以容易修改这些配置项了:

[plain]  view plain  copy
  1. path:c:\\  
  2. defaultpage=index.html  
  3. port=10000  
此时配置项我们只需要加载一次,解析这个文件并要做成单例的:

[html]  view plain  copy
  1. import java.io.IOException;  
  2. import java.io.InputStream;  
  3. import java.util.Properties;  
  4.   
  5. //要求单例  
  6. public class WebProperties extends Properties {  
  7. private static WebProperties myProperties;  
  8.       
  9.     private WebProperties() {  
  10.         //在这里完成读取db.properties文件  
  11.             InputStream iis=WebProperties.class.getClassLoader().getResourceAsStream( "web.properties");  
  12.             try {  
  13.                 this.load(   iis );  
  14.             } catch (IOException e) {  
  15.                   
  16.                 e.printStackTrace();  
  17.             }  
  18.     }  
  19.     //多个客户端上来时,防止多线程  
  20.     public synchronized static WebProperties getInstance() {  
  21.         if( myProperties==null){  
  22.              myProperties=new WebProperties();  
  23.         }  
  24.         return myProperties;  
  25.     }  
  26. }  
在HttpSession这个会话类中,需要完成接收请求和回送响应两个操作,在我们的java的web服务器中,HttpServletRequest是用来发送请求的,HttpServletResponse是用来回送响应的,我们也模仿java的这个机制,用这两个类对请求和响应做处理

HttpServletRequest类要做的是解析浏览器发来的http协议拿到请求头里的资源地址,然后HttpServletResponse得到资源地址后解析资源进行拼接协议响应头回送给客户端,这样一次请求到响应浏览器就可以显示出资源地址的内容了。 

自定义的HttpServletRequest类:

[java]  view plain  copy
  1. import java.io.BufferedReader;  
  2. import java.io.IOException;  
  3. import java.io.InputStream;  
  4. import java.io.InputStreamReader;  
  5. import java.util.HashMap;  
  6. import java.util.Map;  
  7. /** 
  8.  * 这个请求类对浏览器发送的协议进行解析,得到资源地址(这里只考虑get方法,参数拚在请求头中,这里解析出来后不做处理) 
  9.  * @author Administrator 
  10.  * 
  11.  */  
  12. public class HttpServletRequest {  
  13.     private String uri;  
  14.     private String method;  
  15.     private String protocolVersion;  
  16.     private Map<String,String> parameter=new HashMap<String,String>();  
  17.     private InputStream iis;  
  18.     //这个构造函数的iis是从socket中得到的输入流  
  19.     public HttpServletRequest( InputStream iis) throws IOException{  
  20.         this.iis=iis;  
  21.         parse();  
  22.     }  
  23.     //解析协议的方法   GET /company/index.html HTTP/1.1  
  24.     private void parse() throws IOException {  
  25.         BufferedReader br=new BufferedReader(new InputStreamReader(iis));  
  26.         String line=null;  
  27.         int i=0;  
  28.         if((line=br.readLine())!=null){  
  29.             if(i==0){     
  30.                 parseCommandLine(line);  
  31.             }  
  32.             i++;  
  33.         }  
  34.     }  
  35.     private void parseCommandLine(String line) {  
  36.         if(line!=null&&!"".equals(line)){  
  37.             String [] strs=line.split(" ");  
  38.             method=strs[0];  
  39.             protocolVersion=strs[2];  
  40.             if("GET".equals(method)){  
  41.                 doGet(strs[1]);  
  42.             }  
  43.         }  
  44.     }  
  45.     private void doGet(String str) {  
  46.         //解析是否有参数  
  47.         if(str.contains("?")){  
  48.             String[] strs=str.split("?");  
  49.             uri=strs[0];  
  50.             String[] ps=strs[1].split("&");  
  51.             for(String s:ps){  
  52.                 String[] pp=s.split("=");  
  53.                 parameter.put(pp[0], pp[1]);  
  54.             }  
  55.         }else{  
  56.             uri=str;  
  57.         }  
  58.           
  59.     }  
  60.     //get方法参数的类  
  61.     public String getParameter(String key) {  
  62.         String value=parameter.get(key);  
  63.         if(!value.equals("")||!(value==null)){  
  64.             return value;  
  65.         }else{  
  66.             return null;  
  67.         }  
  68.           
  69.     }  
  70.     public String getUri() {  
  71.         return uri;  
  72.     }  
  73.     public String getMethod() {  
  74.         return method;  
  75.     }  
  76.     public String getProtocolVersion() {  
  77.         return protocolVersion;  
  78.     }  
  79.       
  80. }  
自定义的HttpServletResponse类:

[java]  view plain  copy
  1. import java.io.File;  
  2. import java.io.FileInputStream;  
  3. import java.io.IOException;  
  4. import java.io.OutputStream;  
  5.   
  6. /** 
  7.  * 服务器响应类,这个类得到资源地址后对文件进行解析(这里只当字符全部输出), 
  8.  * 然后拼接响应头给浏览器浏览器接收后显示信息 
  9.  * @author Administrator 
  10.  * 
  11.  */  
  12. public class HttpServletResponse {  
  13.     private OutputStream oos;  
  14.     public HttpServletResponse(OutputStream oos){  
  15.         this.oos=oos;  
  16.     }  
  17.     public void redirect(String pageUrl){  
  18.         //输出流到客户端  
  19.         byte[] bs=new byte[1024];  
  20.         FileInputStream fis=null;  
  21.         File f=new File(pageUrl);  
  22.         if(!f.exists()){  
  23.             out404();  
  24.             return;  
  25.         }  
  26.         try {  
  27.             fis=new FileInputStream(f);  
  28.             StringBuffer sb=new StringBuffer();  
  29.             int length=-1;  
  30.             while((length=fis.read(bs,0,bs.length))!=-1){  
  31.                 sb.append(new String(bs,0,length,"gbk"));  
  32.             }  
  33.             //正常的时候响应的协议  
  34.             String responseHead="HTTP/1.1 200 OK\r\nContent-Type: text/html;charset=gbk\r\nContent-Length: "+sb.toString().getBytes().length+"\r\n\r\n";  
  35.             out(responseHead,sb.toString());  
  36.         } catch (Exception e) {  
  37.             // TODO Auto-generated catch block  
  38.             Utils.printException(e);  
  39.         }   
  40.     }  
  41.     private void out404() {  
  42.         String responseBody="<h1>没有页面</h1>";  
  43.         //TODO:  
  44.         String responseHead="HTTP/1.1 404 Not Found\r\nContent-Type: text/html;charset=utf-8\r\nContent=Length: "  
  45.             +responseBody.getBytes().length+"\r\n\r\n";  
  46.         try{  
  47.             out(responseBody,responseHead);  
  48.               
  49.         }catch(Exception e){  
  50.             Utils.printException(e);  
  51.         }  
  52.           
  53.     }  
  54.     private void out(String responseHead,String responseBody) throws IOException{  
  55.         oos.write(responseHead.getBytes());  
  56.         oos.write(responseBody.getBytes());  
  57.         oos.flush();  
  58.     }  
  59. }  
最后一个就是我们的会话类了,这个类进行集中处理整个流程的操作:

[java]  view plain  copy
  1. import java.io.IOException;  
  2. import java.io.InputStream;  
  3. import java.io.OutputStream;  
  4. import java.net.Socket;  
  5.   
  6. /** 
  7.  *  
  8.  * @author Administrator 
  9.  *获取输入流,得到客户端传来的协议 
  10.  *将协议解析一个HttpServerletRequest对象(http://localhost/compay/index.html) 
  11.  *协议 GET /company/index.html HTTP/1.1 
  12.  */  
  13. public class HttpSessionTask implements Runnable {  
  14.     private Socket s;  
  15.     private InputStream iis;  
  16.     private OutputStream oos;  
  17.     private boolean flag=true;  
  18.     public HttpSessionTask(Socket s){  
  19.         this.s=s;  
  20.         try {  
  21.             iis=s.getInputStream();  
  22.             oos=s.getOutputStream();  
  23.         } catch (IOException e) {  
  24.             Utils.printException(e);  
  25.             flag=false;  
  26.         }  
  27.           
  28.     }  
  29.     //因为http协议是一个无状态的,请求完后回应一次断开  
  30.     public void run() {  
  31.         if(flag==false){  
  32.             return;  
  33.         }  
  34.           
  35.         try {  
  36.             //创建requset对象解析http协议的请求部分   GET /company/index.html HTTP/1.1  
  37.             //得到资源地址 /kaw/index.html  
  38.             //通过配置文件找到path c:\kaw\index.html  
  39.             //再创建response对象,调用redirect(path);  
  40.             HttpServletRequest request=new HttpServletRequest(iis);  
  41.             String uri=request.getUri();  
  42.             String filepath=WebProperties.getInstance().getProperty("path")+uri;  
  43.             HttpServletResponse response=new HttpServletResponse(oos);  
  44.             response.redirect(filepath);  
  45.         } catch (IOException e) {  
  46.             // TODO Auto-generated catch block  
  47.             Utils.printException(e);  
  48.             out500(e);  
  49.         }finally{  
  50.             if(this.s!=null){  
  51.                 try {  
  52.                     s.close();  
  53.                 } catch (IOException e) {  
  54.                       
  55.                     e.printStackTrace();  
  56.                 }  
  57.             }  
  58.         }     
  59.     }  
  60.     private void out500(Exception e) {  
  61.         //拼接协议输出错误信息  
  62.         //略  
  63.           
  64.     }  
  65.   
  66. }  
好的,我们只需要在c盘放一个普通的html文件,启动tomcatserver类。

用浏览器访问地址:

网页就被读取出来了,当然这是个很简单的服务器,也只能操作普通文本,后续的学习希望可以深入服务器的学习,多多交流!




java+Tomcat搭建一个简单的服务器 开发环境 JDK 。最好使用java8,其他版本可能会出问题。 eclipse开发工具。Eclipse Jee Oxygen,java开发 IDE。 Tomcat 9服务器。 Mysql数据库。mysql环境安装好,使用workbench进行操作。 创建项目 打开eclipse,先配置Tomcat服务器。 (1).打开windows-> preferences,找到Server下方的R... 阅读详情

相关推荐

实现自定义的Web服务器(C#)

Web服务器,实现自定义的Web服务器(C#)

web服务之Tomcat

优化主要包括三方面,分别为操作系统优化(内核参数优化),Tomcat配置文件参数优化,Java虚拟机(JVM)调优。以上是一些常用的配置参数,还有好多其它的参数设置,还可以继续深入的优化,HTTP Connector 与AJP Connector 的参数属性值,可以参考官方文档的详细说明进行学习。-------java.sh中补充的知识点-----------------------------------#----------------参数解释-----------------------------

m0_74848517的博客 682

ArcGIS基于DEM提取微流域单元(附练习数据下载)

流域作为一个相对独立的地理单元,与行政区的划分有着本质上的区别。流域的划分更注重自然因素,流域作为一个综合的自然整体,在其内部形成了一个天然的物质与能量流动的场所,并通过水流的作用,与周围的区域进行物质和能量的交换。流域的精确划分作为一个研究的基础工作,那么接下来给大家说一下利用DEM提取小流域的案例教程——以贵州省遵义市正安县为例。 1 数据获取 地理空间数据云(http://www.gscloud.cn/),数据分辨率为30m。也可直接点击这篇直接下载→全国30m90mDEM下载。 若想要获得更高精度.

qq_43173805的博客 4834

Web核心快速学习之TomCat服务器

概念Tomcat是Apache 软件基金会一个核心项目,是一个开源免费的轻量级Web服务器,支持Servlet/JSP少量JavaEE规范。JavaEE:Java Enterprise Edition,Java企业版。指Java企业级开发的技术规范总和。包含13项技术规范:JDBC、JNDI、EJB、RMI、JSP、Servlet、XML、JMS、Java IDL、JTS、JTA、JavaMail、JAFTomcat 也被称为 Web容器、Servlet容器。

o676448的博客 533

航天仿真必看:如何用SOFA库实现高精度GCRS-ITRS坐标转换?避坑指南

本文深入解析了航天仿真中高精度GCRS-ITRS坐标转换的关键技术,重点介绍了SOFA库在天球系与轨道系转换中的权威应用。通过对比传统方法的误差来源,详细阐述了SOFA库的转换算法优势、工程实现步骤及误差控制策略,为航天器轨道仿真提供毫米级精度的解决方案。

7h6j5k4l3的博客 850

基于Matlab-Simulink的大林算法控制系统设计与振铃消除实验

本文详细介绍了基于Matlab-Simulink的大林算法控制系统设计与振铃消除实验。通过分析纯滞后系统的控制难题,探讨大林算法在工业控制中的应用优势,并提供Matlab-Simulink环境搭建、控制器D(z)设计、振铃消除及仿真实验的完整流程。文章还对比了大林算法与PID控制的性能差异,为工程实践提供参考。

dropout6artist的博客 796

Web服务器——Tomcat的基本使用

Tomcat是Apache软件基金会一个核心项目,是一个开源免费的轻量级(支持的规范比较少,用起来简单)Web服务器,支持Servlet/JSP少量JavaEE规范,适合新手进行学习。

qq_52276628的博客 621

新版本大疆智图4.5 永久许可摄影测量建模软件

大疆智图支持常见格式的成果输出,包括 TIFF 正射影像和高程模型、LAS 格式点云,以及 B3DM、OSGB、OBJ 等六种常用格式的三维模型,还包括 DXF 和 SHP 等格式的等高线。大疆智图 DJI Terra是领先的三维重建软件,提供先进的技术和简单的操作,一站式解决方案,从航线规划到数据的获取,以及模型重建、数据分析等都提供独一无二的支持,优化项目工程,提供自动化优势,获得更有效智能的决策和行动,最终用户可以获得理想的结果,减轻工作压力,提高作业效率。质量报告和剖面查看功能有助于分析点云质量。

qq_62821232的博客 6901

自定义Tomcat

一、Tomcat_v1 Tomcat服务器本质上就是一个 Server的程序,所以这里我们先写一个Server的程序和Socket程序,先完成最基本的通讯功能 Server.java: package com.tomcat_v1.mySocket_v1; import java.io.IOException; import java.io.InputStream; import java...

AN_ERA的博客 1691

手把手教你用P-MOS管搭建双电源自动切换电路(含AO3401选型指南)

本文提供了一份基于P-MOS管AO3401构建高可靠双电源自动切换电路的实战指南。文章详细对比了继电器、理想二极管与MOS管方案的优劣,深入解析了AO3401的关键参数选型,并手把手指导了从原理图设计、PCB布局到上电调试的全过程,旨在帮助硬件工程师和创客以极低成本实现无缝、高效的电源冗余方案。

moss5的博客 1235

小论文/大论文必备| YOLO26热力图可视化,支持8种常用热力图方法:GradCAM,GradCAMPlusPlus,XGradCAM,EigenCAM,HiResCAM等,助力小论文和大论文加分

本文介绍了如何为YOLO26模型添加热力图可视化功能,包括完整代码和使用教程。热力图能增强模型的可解释性,适用于论文中的实验对比和结果展示。文章提供了详细的代码实现,包含图像处理、热力图生成和结果可视化等功能,并指导用户如何创建Python文件、粘贴代码以及调整参数生成最佳热力图。通过设置不同层号,用户可以灵活控制热力图效果,最终结果将保存在指定文件夹中。

Ai缝合怪、助力小伙伴高效发论文 493

Web服务器TomCat快速入门(从安装到部署)

Web 服务器是一个应用程序,对 HTTP 协议的操作进行封装,使得程序员不必直接对协议进行操作,让 Web 开发更加的便捷。Web 服务器是安装在服务端的一款软件,我们可以将自己的 Web 项目部署到 Web 服务器软件中,当 Web 服务器软件启动后,部署在 Web 服务器软件中的资源就可以通过浏览器来访问。Web 服务器主要的功能是提供网上信息浏览服务。

zhangxia_的博客 3339

matlab 基于离散余弦变换DCT的最小二乘相位解缠

最小范数法是寻求在解包裹相位的局部微分与包裹相位微分相一致的条件下, 逼近于真实相位分布的解包裹相位分布。目标是使解包裹相位与包裹相位曲面的差最小

点云侠的博客 285

MyEclipse+Tomcat坏境搭建

MyEclipse+Tomcat环境搭建 Tomcat服务器安装与测试 1、 登录http://tomcat.apache.org/下载Tomcat合适版本,由于MyEclipse当前支持的最高版本为7.x版本,方便与MyEclipse的集成,这里下载Tomcat 7.x版本的服务器。 2、 解压下载的Tomcat服务器到合适位置,该位置自己指定,解压之后得到一下目录树 3、 运行To

哟呼很多事的专栏 1486

面试问题总结——关于OpenCV(一)

整理了一下网上和我面试中遇到的关于OpenCV相关的问题。 其中因为我的简历中有个项目用到了特征点检测相关的知识,所以整理了SIFT/SURF和FLANN。 有些知识点也不深入,对于写的不对的地方,欢迎指正。 关于OpenCV的内容 1.OpenCV中cv::Mat的深拷贝和浅拷贝问题   深拷贝:分配新内存的同时拷贝数据,当被赋值的容器被修改时,原始容器数据不会改变。   浅拷贝:仅拷贝数据,当被赋值容器修改时,原始容器数据也会做同样改变。 OpenCV的Mat时,有几种赋值方式分别为:   深.

boss-dog 1万+

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

手写一个简单的tomcat(从零到一,简单易懂)

教你从零到一构建一个简易的tomcat,获取请求,解析请求,响应资源,刚接触tomcat,本文章是非常适合的,欢迎小伙伴们学习留言交流哦!!!

比时代快才是快,趁风使柁 1645

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

tomcat服务器的配置与故障排除

大家好,今天分享tomcat 服务器 Tomcat 服务器是一个免费的开放源代码的Web 应用服务器 这是tomcat官网,点一下就可以了 下面再Windows 环境下,进行安装与配置 我使用的是这个版本:(下载下来之后,需要解压一下) 打开tomcat。可以看见里面的文件 bin: 这是运行它的脚本文件 conf : 这是tomcat 的配置文件 lib : 这里是它的jar包 logs : 这里是它的日志文件 webapps:这是存放网站的资源 work

weixin_47556601的博客 3803

visio安装包

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

javaWeb_01-web开发相关概念与常见web服务器

01-web开发相关概念与常见web服务器 常见WEB服务器 BEA:应用广泛的Web服务器,支持J2EE.(价格很贵) WebSphere:支持J2EE Tomcat:支持JSP和Servlet规范。 自定义: public class Sevice{ public satic void main(String args[]){ ServerSocket server = new Serv

Tech My Life 731

Tomcat在自定义xml文件中配置虚拟目录

在实际开发中,如果,经常在server.xml文件中,配置虚拟目录会有一个弊端 就是,每次修改server.xml文件之后,想要文件生效,必须重新启动Tomcat服务器 为了解决这个问题,可以采用另外一种方式在自定义的XML文件中,配置虚拟目录 首先,进入<Tomcat安装目录>\conf\Catalina\localhost目录 在该目录中,创建一个名为chapter02.xml的配置文件

天高任鸟飞 3860

嵌入式Tomcat简单地尝试下

package com.xiuye.server; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet...

修也 1164

JavaWeb与Tomcat基础

什么是web应用程序?web应用程序是如何实现的

weixin_57110607的博客 298

web3-手写tomcat

手写tomcat

growing_duck的博客 358

Tomcat服务器部署+Web项目搭建

Tomcat服务器部署+Web项目搭建 1.Tomcat服务器     1 . Tomcat下载     2 . Tomcat启动与关闭     3 . 配置端口号2.IDEA搭建Web项目 1 . web项目创建 2 . 本地服务器配置 Tomcat下载 tomcat官网:tomcat 选择与自己电脑对应的位数下载,我们下载64位的 下载完成以后,我们将tom

qq_45809464的博客 2万+

Web应用服务器——Tomcat

最近学校的课程在学习Spring框架,接触到了Tomcat,这一篇就来浅析一哈Tomcat的安装及使用 1.Web应用服务器 首先来明晰一下Tomcat是用来干什么的, 2.官方下载 3.目录解析及运行 4.可能出现的问题及解决方案 5.网页的发布 ...

敲敲敲 4274

WEB服务器——Tomcat

Tomcat 是一个开源的轻量级 Web 服务器,主要用于运行 Java Web 应用。它支持 Servlet 和 JSP 规范,是一个 Servlet 容器。Tomcat 内部集成了 HTTP 服务器,可以响应客户端的 HTTP 请求。

cyt涛的博客 1400
上一篇: Spring及其优点
下一篇: Java 事务及隔离级别
CZ__
博客等级 码龄9年 97粉丝 114原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值