Android开发之实现两个手机之间的通讯

无需服务器:Android 应用中使用 P2P 技术进行局域网内设备通信 P2P 技术是 Android 应用中构建局域网设备通信的一种有效方式。通过使用 Wi-Fi Direct 技术,可以实现设备之间的直接通信,而无需经过服务器或者其他中介设备。要在 Android 应用程序中实现 P2P 技术,需要完成以下步骤:添加 Wi-Fi Direct 权限,初始化 Wi-Fi Direct,搜索设备,获取设备列表,建立连接和传输数据等。借助 P2P 技术, Android 应用程序可以实现更高效的局域网通信,从而增强用户体验。 阅读详情
AI摘要

本文详细介绍了如何利用Socket实现两个Android设备之间的实时通讯,包括客户端和服务端的具体实现流程及关键技术点。

欢迎转载,转载请注明出处:http://blog.youkuaiyun.com/dmk877/article/details/51685656

 

Hello,大家好,今天又来写博客了,项目终于搞完了最近又有时间写写博客了。在上上篇博客中我们学习了Android中网络通讯,并用Socket实现了Android客户端与服务器的通讯,那么这一篇将进一步来完善这一功能,就是要实现两个android手机端的通讯。

如有谬误,欢迎批评指正,如有疑问欢迎留言

通过本篇博客你将学到以下知识点
①Socket的用法
②如何实现两个手机的端的通讯
③JAVA中的流的小知识

1、如何实现两个手机端的通讯

在开始之前我们先来分析以下如何实现这个通讯,首先来考虑这么几个问题
①这种实时的通讯应采取哪种通讯方式
②怎么保证是消息能到达我们想发送的那一方,也就是说A想与B交流怎么保证B收到的消息是A发过来的
③怎么保证消息的实时性,也就是说A发一条消息B能实时收到。
要想回答这三个问题其实不难,读过Android开发之网络通讯详解这篇博客的童鞋应该知道,这种及时性比较高的通讯一般采用Socket这种通讯方式,而对于第二个问题如果想让消息到达我们的指定方,针对A和B需要有一个唯一的标识,这个标识我们可以自己定义,在本文中采用的策略是为A和B定义一个ID来唯一的确定它,在A用户发送消息的时候只要指定它想把消息发送到的那个用户的ID就能保证B收到的消息是A发过来的。保证消息的实时性也就是通过使用Socket来解决的。

2、实现两个手机端通讯的原理图

通讯的过程图解

从上图我们可以清楚的看到整个过程服务器充当的是一个中转的作用,clientSocket1首先会将消息封装成json发送给服务器,服务器解析后再封装将消息发送给clientSocket2。

3、实现两个手机端通讯客户端的实现

客户端的运行效果图(注意:下面是一整张图,是一张图片):

上述运行效果就实现了两个Android机的相互通讯。两个客户端分配的id分别为0和1。在发送消息时需要指定消息的到达方。

3.1 客户端发送消息实现步骤

第一步需要做的当然就是连接到服务器,连接服务器的方法为

clientSocket=new Socket(ip,port);
即设置服务器的ip和端口号,建立连接之后通过while(true)就可以不断的监听服务器是否发送过来消息了。

第二步就是要输入你要发送的好友的id号,这样就能保证你发送的消息能按照你的预期到达接收方。

第三步就是发送消息了在发送消息的时候需要注意,我们是把消息封装成json发过去的,这个json中包含哪些信息呢?有三种信息①消息发送方id②消息的内容③消息到达方id。

封装json的代码如下

  //根据clientSocket.getOutputStream得到BufferedWriter对象,从而从输出流中获取数据
   mWriter=new BufferedWriter(new OutputStreamWriter(clientSocket.getOutputStream(),"utf-8"));
   。。。。。
   //封装成json
   JSONObject json = new JSONObject();
   json.put("to", Integer.parseInt(friendId));
   json.put("msg", msgContent);
   //通过BufferedWriter对象向服务器写数据
   mWriter.write(json.toString()+"\n");
   //一定要调用flush将缓存中的数据写到服务器
   mWriter.flush();
这个json中包含三个信息:①消息到达方id②消息的内容③消息发送方的id。封装后通过BufferWriter的write方法将消息发送到服务器。

3.2 客户端接收消息的实现

这里接收消息是用了while循环不断的监听服务器是否有消息发送过来,如果有消息发送过来则用BufferedReader一行一行的去读取消息的内容,然后显示,实现的主要代码如下:

//根据clientSocket.getInputStream得到BufferedReader对象,从而从输入流中获取数据
     mReader=new BufferedReader(new InputStreamReader(clientSocket.getInputStream(),"utf-8"));
     //根据clientSocket.getOutputStream得到BufferedWriter对象,从而从输出流中获取数据
     mWriter=new BufferedWriter(new OutputStreamWriter(clientSocket.getOutputStream(),"utf-8"));
     while(isReceivingMsgReady){
      if(mReader.ready()){
       Message msg = handler.obtainMessage();
       msg.what=2;
       msg.obj=mReader.readLine();
       handler.sendMessage(msg);
      }
      Thread.sleep(200);
     }
     mWriter.close();
     mReader.close();
     clientSocket.close();

可以看到在客户端通过while循环当mReader.ready()为true时就会读取服务器返回消息的一行,然后更新显示。
4、实现两个手机间的通讯服务器的实现

服务器端的代码我使用是MyEclipse,首先我们来看看上述发送消息的过程中服务器端运行的截图:

 

服务器端的功能是怎么实现的呢?毫无疑问首先要做的当然是初始化服务器并指定端口号,代码如下:

serverSocket = new ServerSocket(SOCKET_PORT);

接着当有客户端连接到服务器时会为每一个客户端开启一个子线程,并将这个子线程加入到集合中对应的代码如下

while (flag) {
    //有客户端连接,时serverSocket.accept()方法会返回客户端socket
    Socket clientSocket = serverSocket.accept();
    SocketThread socketThread = new SocketThread(clientSocket,socketId++);
    socketThread.start();
    mThreadList.add(socketThread);
   }

在开启的子线程SocketThread中会有一个while循环监听客户端发过来的消息,并将这条消息添加到mThreadList集合,在这个子线程中循环读取客户端发过来的消息  

//循环读取客户端发过来的消息
    while (flag) {
     if (reader.ready()) {
      String comeData=reader.readLine();
      JSONObject msgJson = new JSONObject(comeData);
      Message msg = new Message();
      msg.setTo(msgJson.getInt("to"));
      msg.setMsg(msgJson.getString("msg"));
      msg.setFrom(mSocketId); 
      msg.setTime(getTime(System.currentTimeMillis()));
      mMsgList.add(msg);
      System.out.println("用户:"+mSocketId+"向用户:"+msg.getTo()+"发送的消息内容为:"+msg.getMsg());
     }
     Thread.sleep(100);
    }

其实也就是说在服务器中为每一个连接到服务器的客户端开启一个子线程,并在这个子线程中循环监听这个客户端是否发过来消息,在上面我们看到服务器解析消息后,将这条消息封装到了Message这个bean中并添加到了集合中。Message中包含的信息从上面可以看出。到这里服务器就可以收到服务器发过来的消息了,服务器收到消息后要做的工作就是将这条消息发送给客户端,(从实现原理图中可以看出服务器起到一个中转的作用)那么怎样实现这个功能呢?它的实现也不难,从上面的描述我们可以知道只要客户端向服务器发送一条消息,我们就会将这条消息放到一个集合mMsgList中,也就是说只要服务器收到消息mMsgList这个集合就不为空,只要mMsgList这个集合不为空就说明服务器还拥有未转发的消息,需要转发。怎么实现转发呢?

      首先这里有两个集合一个是Message的集合mMsgList,另一个是为每一个客户端Socket开启的一个子线程SocketThread的集合mThreadList。这两个集合的关系是每一个Message肯定是mThreadList中的一个SocketThread(客户端)发送的。

当SocketThread的id与Messsage中的to(即消息的到达方)相等时,因为每一个客户端(假设是clientSocket1)连接到服务器时都要开启一个SocketThread子线程,在这个子线程中有clientSocket1的引用,所以当相等时就说明这个Message是发送给这个clientSocket1的。然后通过这个clientSocket1的BufferedWriter将这个消息发送给这个客户端。与其对应的代码如下

while(flag) {
      if(mMsgList.size() > 0) {
       Message from = mMsgList.get(0);
       for(SocketThread toThread : mThreadList) {
        //遍历mThreadList如果to.socketID==from.to说明这个toThread与mMsgList中的这条内容是对应的
        //这里toThread的作用是通过它得到这条消息的BufferedWriter,mMsgList.get(0)得到这条消息,然后通过
        //BufferedWriter将这条消息发送到指定方
        if(toThread.mSocketId == from.getTo()) {
         //这里的writer是SocketThread中的writer,这样才能保证在调用writer.flush之后消息到达
         //我们的指定方
         BufferedWriter writer = toThread.writer;
         JSONObject json = new JSONObject();
         json.put("from", from.getFrom());
         json.put("msg", from.getMsg());
         json.put("time", from.getTime());
         writer.write(json.toString()+"\n");
         writer.flush();
         System.out.println("转发消息成功");
         break;
        }
       }
       mMsgList.remove(0);
      }
      Thread.sleep(200);
     }

这样将这条消息解析封装成json后就发送到了指定的客户端,就完成了两个android机的通讯。其实个人觉着对这些原理的知识还是需要去好好学习,弄懂的,它的实现思想对我们以后的编程也是很有作用的。

关于实现两个手机端通讯的讨论就到这里了,可能我们看到的那些通讯的软件采用的方式不是本文使用的方式,但是原理性的东西是不会变的,这篇博客也是从最原始的地方来理解手机通讯的一些简单的原理。

如有谬误,欢迎批评指正,如有疑问欢迎留言。

如果本篇博客对你有帮助就点击左上角关注,关注吧,锁定本台观看更多精彩内容0.0

 

这里提醒大家注意的是源码包含两部分,一部分是服务端,另一部分是客户端,服务端是MyEclipse程序,客户端就是我们的android程序。

 
Android简单通讯录的开发 本次开发分为4步: 1、获取手机通讯录的信息; 2、手机通讯录的数据封装; 3、手机通讯录的信息的UI适配; 4、对ListView的优化。 GetNumber.java: 用来获取手机通讯录。下面是代码部分: package com.example.getmyphonenumber; import java.util.ArrayList; import java.u 阅读详情

相关推荐

Android系统手机通讯录

基于Android系统手机通讯录软件的设计和开发自google于2005年收买Android公司,Android商场有了很大的遍及,加上无线网络的敏捷开展,手机网速有了很大的提高,为智能手机的开展供给了很大的可能性,也为APP的开展带来无限可能。本通讯录是依据Android的,以Java为底层言语,挑选Eclipse作为开发工具,因为自己特别喜爱用Android写APP,决定写出归于自己的一个通讯...

qq_820629211的博客 5330

android socket双向,【笔记】两台Android手机的Socket双向通信

上学期搞定了小车,现在终于结束了大机器人,趁还没真正进入考研复习的高潮赶紧把以前的代码整理整理。先讲讲我们那小车,2台手机+车体组成。一个手机放车上作为server,用其摄像头、陀螺仪、磁力计来获取图像、确定小车方向。另一台手机负责控制,作为client,并画出小车行进图。如何从server获取陀螺仪、磁力计角度,又如何把client的控制命令发送给server就成了一个问题。这里我们使用sock...

weixin_35516624的博客 759

Android开发之获取手机通讯录

获取手机通讯录是Android最常用的小功能,今天自学到了,记下来,主要是通过系统自带的内容提供者提供的数据,我们使用内容接收者获取相应的数据到cursor中,然后获取对应data表中的字段,相关字段代表什么含义,只能自己去查了。 下面是手机通讯录列表的代码,仅供参考: package com.andy.phonecontact; import java.util.ArrayList; im

Andyの笔记 4068

Android 使用socket实现两个真机之间的通信

1、使用Socket进行两个手机之间的通信需要安装两个不同的代码文件:服务端和客户端   分别进行安装2、创建局域网:两个手机同时连一个WiFi或者两个手机进行热点和WLAN连接3、客户端连接另一个手机IP时把另一个手机的IP改成静态IP(3的第二种方法做这个步骤)下面上代码分客户端的和服务端的,布局文件textview、Editview、Button不上代码了,不懂socket通信原理的可以在百...

狂奔的奶牛 7393

安卓开发中的USB转串口通讯

安卓开发中的USB转串口通讯本文使用GitHub上开源的”hoho.android.usbserial”USB串口库。该库基于“Android USB Host API”,驱动完全由java开发,无需root,不限内核,很是方便。简介Anddroid USB Host API原文链接 android.hardware.usb包下提供了USB开发的相关类。 我们需要了解UsbManager

STchaoL的博客 7275

pc串口调试工具与安卓app通讯,pc及手机串口配对方法

一、pc串口调试工具 串口调试工具下载地址:https://www.onlinedown.net/soft/261875.htm 二、笔记本电脑蓝牙设置 1、进入蓝牙页面,开启蓝牙 2、往下拉,找到 “更多蓝牙选项” 并点击进入 3、勾选 ✔“允许蓝牙设备查找这台电脑” 4、来到第二个选项卡,点击 “添加” 5、选择 “传入(设备启动连接)”,然后确定 6、此时会多出一个端口(我这里是COM6) 7、然后找到 “设备管理器” 页面 8、在这里你会看到你刚才创建的COM端口 9、右击该端口,属

weixin_44902943的博客 6452

Android客户端与服务器之间传递json数据

在服务器与客户端之间通信,json数据是一种常用格式,本文主要在服务器端构建数据,在客户端接收显示,并且在listview上显示出来 服务器端的构建 简单的javabean与返回结果函数与插入函数略过 public void doGet(HttpServletRequest request, HttpServletResponse response) ...

weixin_30721899的博客 444

蓝牙通信 Android开发实现手机间通过蓝牙传输文件

通过Android开发实现手机间通过蓝牙传输文件 实验小作业,详细分析 安卓平台提供对蓝牙的通讯栈的支持,允许设备和其他的设备进行无线传输数据。应用程序层通过安卓API来调用蓝牙的相关功能,这些API使程序无线连接到蓝牙设备,并拥有P2P或者多端无线连接的特性。 蓝牙(Bluetooth)是一种短距离的无线通信技术标准。蓝牙协议分为4层,即核心协议层、电缆替代协议层、电话控制协议层和采纳的其它协议层。这4种协议中最重要的是核心协议。蓝牙的核心协议包括基带、链路管理、逻辑链路控制和适应协议四部分。其中链路管理(LMP)负责蓝牙组件间连接的建立。逻辑链路控制与适应协议(L2CAP)位于基带协议层上,属于数据链路层,是一个为高层传输和应用层协议屏蔽基带协议的适配协议。 1、扫描其他蓝牙设备 2、为可配对的蓝牙设备查询蓝牙适配器 3、建立RFCOMM通道(其实就是认证) 4、通过服务搜索来链接其他的设备 5、与其他的设备进行数据传输

Android网络开发中如何使用JSON进行网络通信---Android_JSON数据通讯方法解析

1、服务端接口程序 第一步,我们创建一个名为User的JavaBean作为用户对象类,用来保存演示数据。   public class User {     private int id;     private String name;     private String email;     private String gender;          public in

瑺圊樹的专栏 596

Android实现两个手机间的通讯

博客地址://blog.youkuaiyun.com/dmk877/article/details/51685656

在没有信用卡的情况下怎么申请谷歌云(Google Cloud)?

这笔额度足够用来跑一台云服务器、部署小型网站,甚至可以尝试 AI、机器学习等项目。但问题来了——想要拿到这 300 美元,你必须先通过支付方式验证。默认选项就是绑定一张国际信用卡(Visa、MasterCard 之类),然而不少人没有信用卡,或者信用卡无法支持国际支付,结果就卡在注册第一步。很多人会疑惑:既然是送额度,为什么还要绑卡?原因其实很简单:谷歌需要确认你是真实用户,而不是批量注册薅羊毛;通过支付验证,后续如果你用完 300 美元额度,可以直接进行付费使用;

m0_74824483的博客 5654

Android 手机与PC通过USB通讯

Android 手机与PC通过USB通讯方法: https://www.aliyun.com/jiaocheng/109593.html https://blog.youkuaiyun.com/jakemiao/article/details/17270785 https://blog.youkuaiyun.com/wufenglong/article/details/5778862 https://blog.c...

weixin_42469209的博客 1608

雷达截面积建模仿真(RCS)

在目标侧,其形状、材料、尺寸(相对于雷达波长)和相对于雷达观察方向的方向等特征都会影响雷达看到的RCS。严格的数学处理超出了讨论的范围,但入射波和目标之间的相互作用可以定性描述。对于给定的散射方向,可以积分求和物体表面电流的振幅相位,当电流同相时,会出现较大的回波幅度。随着目标方向和雷达视角随时间变化,电流振幅和相位会发生变化,形成看似随机的峰值和零点的散射模式,出现“相长”和“相消”干涉。除了雷达到目标的距离外,雷达截面(RCS)是RRE(雷达距离方程)中唯一与目标相关的参数,因此不在雷达设计者的。

qq_30796447的博客 3138

Android开发手机通讯录

Android Studio开发手机通讯录课程设计课程设计要求课程设计题目题目1 通讯录管理题目2 拨号和短信管理代码实现首先我们先来理清楚思路创建数据库设置适配器主页面添加联系人活动编辑联系人活动主活动配置AndroidManifest.xml文件程序效果 课程设计 经过一个学期的Android开发学习,本次学期末,为了检验大家的学习情况,此次期末的课程设计为使用Android Studio...

qq_44046765的博客 2万+

使用FloodRisk2插件进行洪水风险评估

入汛以来,长江流域持续的强降雨使得沿岸多地成为洪水风险极高地区,抗洪、抢险、救灾继新冠病毒之后成为又一个攻坚阵地。如何科学地评估洪水风险,是快速决策的关键。 实际生活中,根据风险是否可控,一般将洪水风险大致分为两类:一类是通过数据分析可以得出其发生的可能性和后果,如强降雨引发的区域性洪水、水库/大坝溃决洪水等。这类洪水可以通过有关资料分析和设定一定条件计算得到可能的损失后果,也就是说,风险可以预判。另一类洪水风险基本是未知的,如滑坡堵塞河道形成堰塞湖引发的洪水,无法预知事件发生的地点和规模,具体的洪水风险无

QGISClass的博客 2879

全面指南:PyTorch与ROCm版本兼容性及多版本环境管理

本文详细介绍了在AMD GPU上配置PyTorch开发环境的完整流程,重点解决版本兼容性和多版本ROCm环境管理问题。主要内容包括:1) PyTorch与ROCm版本对应关系查询;2) 四种查看ROCm版本的方法;3) 使用update-alternatives管理多版本ROCm;4) 环境变量配置与冲突解决方案;5) 完整的验证流程和性能测试方法。文章提供了最佳实践建议和故障排除清单,帮助开发者快速搭建稳定高效的深度学习开发环境,充分发挥AMD GPU硬件性能。通过系统化的验证流程确保各组件协同工作,解决

数字人生 606

Android Studio中的手机通讯录开发

Android Studio中的手机通讯录,包含功能(按首字母排序,动态添加) 第一次写博客,也刚踏入工作,想着把自己在项目中遇到的问题,以及自己在工作中所做的项目记录下来,方便以后自己查找知识,一开始没有接触过Android,为了找工作,自学了5个月的Java,到公司实习的主要负责任务是安卓开发。 第一个做的任务就是做的手机通讯录,虽然做出来了,但是还是大多数借鉴网络上的,自己再做了一点修改。 下面是自己做的效果图,供大家参考,写的不好,大家就随便看看,希望对借鉴的人有点参考的意义。 上面几幅图形

hanxuanweina88的博客 1万+

TIA protal与SCL从入门到精通(4)——软件单元使用

平台: TIA portal 15.1 1.添加软件单元 添加软件单元如下图: 关于软件单元使用基本限制,看如下文章即可 TIA protal与SCL从入门到精通(3)——软件单元基本介绍 每个软件单元是一个独立结构,所以每个软件单元的运行方式与实际PLC类似,所以首先添加主函数块: 注意:无论系统是否是具有并发性(这里不要混淆并行与并发的概念),在PLC所有主函数执行总是按主函数依次完成...

苦走一口田 7377

Android个人手机通讯录开发详解

一、Android 个人手机通讯录开发 数据存储:SQLite 数据库 开发工具:Android Studio 二、Phone Module 简介 界面展示 文件结构简单分析 三、个人手机通讯录代码实现 清单文件 (AndroidManifest.xml) <?xml version="1.0" encoding="utf-8"?> <manifest x...

杨丙寅 1万+

提升YOLOv8检测精度的边界框损失函数Focaler-IoU与InnerFocalerIoU的应用与效果

YOLOv8是一种常用的实时目标检测模型,基于CNN(卷积神经网络)结构并结合了一些改进技术以提高检测精度和速度。YOLOv8的核心在于边界框的预测和分类,而准确的边界框预测是提高模型整体性能的关键因素之一。在传统的IoU损失基础上,Focaler-IoU和InnerFocalerIoU进一步聚焦于边界框的边缘区域,通过调整损失权重,更好地关注难以检测的边界框,提高模型的鲁棒性和准确性。# 计算IoU# 计算Focaler-IoU损失在这里,我们定义了。

博客 1340

微信小程序、H5微信公众号网页JSAPI:解决报错requestMerchantTransfer:fail:internal error(使用wx.requestMerchantTransfer错误)

如何解决requestMerchantTransfer:fail:internal error,微信小程序wx.requestMerchantTransfer报错,微信公众号H5网页使用jssdk调用wx.requestMerchantTransfer报错,JSAPI调起用户确认收款报错errMsg:“requestMerchantTransfer:fail:internal error“,微信小程序/H5 调起确认收款界面,JSAPI调起用户确认收款,微信公众号(H5),用户发起提现,商家转账给用户,用户

✅ 精选推荐文章 4973

Android实现两个手机间的通讯:让手机之间的联系更加紧密

Android实现两个手机间的通讯:让手机之间的联系更加紧密 去发现同类优质开源项目:https://gitcode.com/ 在智能化生活日益普及的今天,手机间的通讯方式也在不断变革。Android实现两个手机间的通讯项目,正是这样一个极具创新性和实用性的开源项目。本文将详细介绍这个项目的核心功能、技术分析、应用场景及特点,带您探索这一新兴通讯方式的魅力。 项目介绍 Android实现两个手机间...

gitblog_06786的博客 305

一种低照度目标检测新策略:IAT集成YOLOv8实现暗光与雾霾环境下的性能优化【附核心实战代码】

随着深度学习和计算机视觉的快速发展,目标检测模型在各个领域中的应用不断扩展,特别是在低照度环境下的视觉任务。YOLOv8作为当前最先进的目标检测模型之一,在高亮度和良好照明条件下表现出色,但在低照度环境下的性能存在一定的不足。为了解决这一问题,我们提出了一种轻量级的低照度图像增强网络(IAT)来改进YOLOv8的暗光检测能力。本篇文章将深入探讨这一创新改进,并附带代码实现,帮助大家更好地理解这一技术的应用和效果。

一键难忘的博客 3501

stm32 usb和安卓手机的通讯过程

stm32 usb和安卓手机端的通讯流程 前段时间公司开发了一个安卓外设,主要是用某宝淘来的demo 在stm32F103的usb功能来和安卓设备的usb来通讯 叙述之前先来一个整体的框图吧: 需要准备的设备有: ①.安卓手机或者安卓pad,(手机必须支持otg功能,否则就得用host功能了) ②.otg转接线或者转接头 ③.安卓数据线(一定要是能通讯数据的线缆,有些山寨的这个线只有2根线,没有...

u012665888的博客 1万+

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

【安卓实现手机通讯录】开发总结

Android实现手机通讯录总结遇到的问题一、 权限功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 总结遇到的问题 一、 权限 我们对Markdown编辑器进行了一些功能拓展与语法支持,除了标准的Markdown编辑器功能,我们

m0_45948011的博客 4835

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

上一篇: Android开发之getX,getRawX,getWidth,getTranslationX等的区别
下一篇: Android开发之Tween(补间动画)完全解析(上)——xml文件配置的实现
萤火虫Coding
萤火虫Coding 领域专家: 操作系统技术领域 领域专家: 操作系统技术领域
博客等级 码龄15年 953粉丝 58原创
评论 33
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值