如何获得并配对连接在同一Wifi网段上的其他手机

 Android系统有没有提供一个让你方便的获取连接在同一Wifi网段上的其他用户的API呢??答案是否定的,那么Wifi版的飞鸽传书是如何实现这个功能的呢??之前在开发这个项目时,我上网找了很久,也只搜索到mars老师那个视频的搜索Wifi热点的例子。所以,现在发上来给大家分享一下。我个人的理解是“三次握手”。

1、首先,数据接收方Receiver启动广播线程,通过某个特点的端口UDP_BOADCASTPORT,将自己手机本身的名称广播出去,每秒广播一次,代码如下:

// 构造发送数据报 把自己的名字发送出去
     byte[] data = username.getBytes();
     DatagramPacket outgoing = new DatagramPacket(data, data.length, InetAddress.getByName("255.255.255.255"), UDP_BOADCASTPORT);

同时,数据发送方Sender启动监听广播的线程,通过上述的端口UDP_BOADCASTPORT获得接收方Receiver广播出来的用户名,并通过获得的数据包得到Receiver的IP地址,并以列表的形式显示,供Sender选择。代码如下:

// 构造接收数据报
     DatagramPacket incomming = new DatagramPacket(buffer, buffer.length);
     datasocket.receive(incomming);// 接收数据报
   
2、接下来,接收方Receiver在启动广播线程的同时还应该启动获取发送方Sender的Connect请求的线程,通过某个特定的端口TCP_CONNECTPORT阻塞运行;当发送方Sender在用户列表中点击时,启动与所点击的用户的Connect请求线程,并发送自己的用户名给接收方Receiver。(这个很简单,所以就不贴代码啦O(∩_∩)O~)

3、当接收方Receiver的Connect请求线程收到Connect之后accept,同时终止广播线程,并读取发送方Sender的用户名。接着发送“弹出窗口”的Message给执行Handler,询问接收方Receiver是否愿意接受来自发送方Sender的链接请求。

4、当接收方Receiver选择No时,发送一个字节的标志,并退出等待界面;当接收方Receiver选择Yes时,发送一个字节的同意标志,并开始等待发送方数据的传送。(这个传送数据的部分,我已经发表过帖子了,链接地址:如何在同一Wifi网段上传输文件
http://www.eoeandroid.com/forum-viewthread-tid-97074-fromuid-478643.html


5、当发送方接收到接收方Receiver的拒绝标志时,弹出提示对话框告知发送方Sender“您已经被拒绝”了,呵呵!当发送方接收到接收方的同意标志时,弹出对话框询问接收方Receiver是否立即发送数据。

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页