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

人工智能100问☞第5问:什么是AI三要素?

人工智能的核心三要素是​​数据、算法和算力​​,分别作为AI的“燃料”、“大脑”和“动力”,三者协同驱动智能系统的学习、推理与决策能力。

bjdx_001的博客 1992

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

CarPlay无线连接开发实战:从蓝牙EIR查询到iAP2认证的完整代码逻辑梳理

本文详细解析了无线CarPlay连接开发的完整流程,从蓝牙EIR查询到iAP2认证的代码实现。重点介绍了蓝牙握手、WiFi Beacon帧配置、热点信息准备等关键环节的实战技巧,帮助开发者快速搭建稳定可靠的无线CarPlay连接系统。

weixin_31534091的博客 321

Android开发手机通讯录

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

qq_44046765的博客 2万+

Qt+VS集成高德红外相机SDK与OpenCV的采图实践

本文详细介绍了在Qt和Visual Studio环境中集成高德红外相机SDK与OpenCV的完整实践方案。涵盖环境配置、SDK初始化、图像采集与处理、多线程优化等关键技术点,重点解决了高德红外相机数据转换、温度信息提取和Qt界面显示优化等核心问题,为红外图像处理应用开发提供可靠参考。

palm99的专栏 645

(南京观海微电子)——TCON介绍

TCON又称:逻辑板,控制板,在液晶电视里的作用和CRT中的视放板相当,但有本质的区别,逻辑板不是一个纯粹的信号放大器,它输入是LVDS格式信号,而不是RGB。逻辑板的作用是把数字板送来的LVDS或TTL图像数据信号,时钟信号进行处理移位寄存器存储将图像数据信号,时钟信号转换成屏能够识别的控制信号行列信号RSDS控制屏内的MOSFET管工作而控制液晶分子的扭曲度。目前国内主要的TCON板生产商有视显光电。传统TCON的布局主要分为以下两种:X+C分离式和X+C一体式。

m0_75095200的博客 3834

Android Studio中的手机通讯录开发

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

hanxuanweina88的博客 1万+

Spring Boot集成ShardingSphere实现数据加密及数据脱敏 | Spring Cloud 48

利用ShardingSphere实现: - 数据加密 - 数据脱敏

gmHappy 1万+

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

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

杨丙寅 1万+

122、Android Camera HAL3 框架:Request、Result、Metadata 的异步管道模型

本文深入剖析了Android Camera HAL3框架中的异步管道模型,围绕Request、Result和Metadata三个核心要素展开。作者通过实际案例(黑屏闪退问题)切入,揭示了异步模型中常见的帧序错乱陷阱。文章详细阐释了三个角色的交互机制,指出HAL3采用生产者-消费者模式的关键特征:Request与Result一一对应但不保证顺序。针对开发实践,总结了三个必须加锁的场景和回调函数的锁使用禁忌,并给出解决帧序问题的具体方案(独立帧号生成器)。最后提出五项经验性建议,强调异步模型带来的灵活性与复杂性

sundong_81的博客 214

SAP CBC 集成质量系统初始化接入实战指南

摘要 本文探讨了SAP S/4HANA Cloud Public Edition项目中质量系统的初始接入过程。质量系统并非开箱即用,而是需要经过SAP Central Business Configuration(CBC)的Scope and Organizational Structure阶段部署后才能具备完整功能。文章重点分析了几个关键环节:CBC里程碑确认的时机选择、Identity Authentication的初始管理员设置、Business Role Template的创建规范等。实施过程中需特

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

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

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

gitblog_06786的博客 305

【AUTOSAR-E2E】-2.1-配置E2E:基于E2EPW配置一个RX接收的Signal Group(使用E2E Profile 2)

《共13页精讲》:此法也适用于E2E Profile 4/5/6/7/11/22 目录 1 检查CAN Matrix Arxml/DBC是否满足E2E需求 2 在DaVinci Developer中为Port添加E2E保护 3 在DaVinci Configurator settings设置 4 如何使用应用层的E2E保护 5 结尾 <--返回「Autosar_BSW高阶配置」总目录--> <--返回「Autosar_BSW高阶配置」专栏主页--> <--

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

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

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

u012665888的博客 1万+

廖雪峰Python教程[完整版]

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

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

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

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

m0_45948011的博客 4835

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

上一篇: 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、付费专栏及课程。

余额充值