Android/安卓开发之WIFI通讯(上)--搜索区域网内所有设备

我的上一篇文章写的是WIFI的基本应用。基本连上WIFI之后,设备就能联网了,直接用常规的联网方式即可访问互联网(例如okhttp、httpurlconnection等)。

但是我们写个wifi应用不可能是用来联网这么简单哈。设想一下,假如我们连接wifi,但是这个wifi没有连接互联网,我们能用他来干嘛?这就涉及到区域网的应用了。

这不需要连接互联网,只要在大家连接在同一个区域网内的wifi就可以通讯,目前类似应用场景已经很多了。例如各种软件的面对面快传、各种游戏的区域网联机、还有目前常用的智能家居的家具管理、基于wifi的视频监控等等。

 

这里主要是针对android端,当然移植到其他平台上也可以,毕竟有了算法思路。这里打算模拟连接上wifi之后和同在一个区域网的其他用户进行聊天、传输文件等。

要想和同一个区域网内的其他客户端进行通讯,首先要做的就是找到它们啊!所以本文讲的是如何搜索同一区域网内的所有设备。

----要怎么才能做到找到区域网内的所有设备呢?

天马行空1:区域网内建立一个固定ip的服务器,一旦有新的设备连接,就给服务器发送自己的ip和端口存储起来。下线时服务器再把它移除。然后需要搜索区域网内的设备时,只需要查询服务器就行了。

条件:服务器ip不能被占用,需要一个服务器!而且感觉在移动设备上,这个方案不行啊。

天马行空2:类似天马行空1,不需要在本地建立服务器,而是在云端建立数据表...

条件:我在云端查询都需要联网了,你还跟我说不连接互联网也能通讯?

天马行空3:我一个一个ping一下...0-255多试几次嘛

条件:搜索时间那么长,看到我直接卸载这个破应用了

天马行空4:你当面告诉我ip和端口,或者生成二维码给我扫一扫(类似qq快传)嘛,然后在建立链接

条件:我有一句mmp不知道要不要讲...

 

有没有一种方法既不用建立服务器也不用链接互联网,更不用输入ip的方式?

那必须的啊,那就是用广播!我发一个广播,你们收到了就给我回应,这不是简单方便嘛。那怎么发广播呢?这里就涉及到UDP的应用了。关于socket通讯和udp的内容我就不多说了,还那句话不怎么了解的话先看看其他博客或者百度。

---还有一句话:我只是个Android小白,出错或者算法不够好在所难免,请大家多多指教---

思路:

搜索端:

1.建立一个UDP广播,并广播出去

2.建立接收端口,收到回应再给对方发一条确认消息(当然以后是用来约定TCP的传输端口的,这样就能进行通讯了)

2.1.接收端口循环接收,除非用户中断

响应端:

1.建立响应端口,收到广播之后响应消息

1.1循环等待响应,除非用户中断

2.如果收到的是确认消息,则根据约定的规则建立TCP连接(这个文章主要时搜索设备,所以这个没写)

同时,因为是运行在android上,我的要求是要做到 我可以搜索你也可以响应你,反之你可以搜索我也可以响应我。

如果只是一个搜索端,其他都只能是响应端,那不是c/s模型,只有一个能搜索了,这显然不太符合实际要求,所以其实每个设备都有一个响应端和一个搜索端。

这样的话到时候建立TCP连接时,会出现一个问题:到底是由谁来建立服务端?这个在之后在进行处理。

 

有了思路就开始撸代码了--记住本文只是做到能搜索区域网内的所有设备!

搜索端线程:

 

 static class SearchThread extends Thread {
        private boolean flag = true;
        private byte[] recvDate = null;
        private byte[] sendDate = null;
        private DatagramPacket recvDP = null;
        private DatagramSocket recvDS = null;
        private DatagramSocket sendDS = null;
        private Handler mHandler;
        private StateChangeListener onStateChangeListener;
        private int state;
        private int maxDevices;//防止广播攻击,设置最大搜素数量
        public static final int STATE_INIT_FINISH = 0;
        public static final int STATE_SEND_BROADCAST = 1;
        public static final int STATE_WAITE_RESPONSE = 2;
        public static final int STATE_HANDLE_RESPONSE = 3;

        public SearchThread(Handler handler, int max) {
            recvDate = new byte[256];
            recvDP = new DatagramPacket(recvDate, 0, recvDate.length);
            mHandler = handler;
            maxDevices = max;

        }

        public void setOnStateChangeListener(StateChangeListener onStateChangeListener) {
            this.onStateChangeListener = onStateChangeListener;
        }

        public vo
  • 0
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
Android Studio是一款由Google开发的集成开发环境(IDE),用于开发Android应用程序。它提供了丰富的工具和功能,帮助开发者创建、调试和测试Android应用。 在Android Studio中,可以使用WIFI通讯来实现设备之间的数据传输和通信。WIFI通讯可以通过无线网络连接来实现设备之间的数据传输,而无需使用数据线或蓝牙等其他传输方式。 要在Android Studio中使用WIFI通讯,可以使用Android的网络编程API来实现。以下是一些常用的WIFI通讯相关的API和功能: 1. WIFI管理器(WifiManager):用于管理设备WIFI连接状态,包括打开/关闭WIFI、扫描可用的WIFI网络等操作。 2. WIFI信息(WifiInfo):用于获取当前设备连接的WIFI网络的信息,如SSID(网络名称)、BSSID(网络地址)、信号强度等。 3. WIFI扫描结果(ScanResult):用于获取附近可用的WIFI网络列表,包括每个网络的SSID、BSSID、信号强度等信息。 4. WIFI状态广播接收器(WifiStateReceiver):用于监听设备WIFI连接状态变化,如连接成功、断开连接等。 5. TCP/IP通讯使用TCP/IP协议进行设备之间的数据传输,可以通过Socket编程实现。 6. UDP通讯使用UDP协议进行设备之间的数据传输,可以通过DatagramSocket编程实现。 以上是Android Studio中实现WIFI通讯的一些基本概念和API,开发者可以根据具体需求选择适合的方式进行开发。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值