基于Android WiFi直连的P2P聊天程序

要实现点对点通信,过程其实很简单,首先要建立连接,接着取得对方节点的ip地址,最后通过socket通信即可实现。
通过Android提供的WiFi直连技术,可获得同一WiFi下的设备列表,选择其中一台即可实现连接。
首先要在AndroidManifest.xml文件中添加权限,如下所示:
 <uses-permission
        android:required="true"
        android:name="android.permission.ACCESS_WIFI_STATE"/>
    <uses-permission
        android:required="true"
        android:name="android.permission.CHANGE_WIFI_STATE"/>
    <uses-permission
        android:required="true"
        android:name="android.permission.INTERNET"/>
之后在activity中建立相应的广播接收器和点对点管理器
        private final IntentFilter intentFilter=new IntentFilter();
        WifiP2pManager.Channel mChannel;
        private WifiP2pManager mManager;
        private p2pReceiver receiverP2p;
       .........
@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_second);
        intentFilter.addAction(WifiP2pManager.WIFI_P2P_STATE_CHANGED_ACTION);
        intentFilter.addAction(WifiP2pManager.WIFI_P2P_PEERS_CHANGED_ACTION);
        intentFilter.addAction(WifiP2pManager.WIFI_P2P_CONNECTION_CHANGED_ACTION);
        intentFilter.addAction(WifiP2pManager.WIFI_P2P_THIS_DEVICE_CHANGED_ACTION);
        mManager = (WifiP2pManager) getSystemService(Context.WIFI_P2P_SERVICE);
        mChannel = mManager.initialize(this, getMainLooper(), null);
}
在onResume中注册此intentfilter和receiverP2p:
@Override
protected void onResume() {
    super.onResume();
    receiverP2p=new p2pReceiver(mManager,mChannel,SecondActivity.this);
    registerReceiver(receiverP2p,intentFilter);
}
记得在onDestroy中解除广播:
@Override
protected void onDestroy() {
    super.onDestroy();
    unregisterReceiver(receiverP2p);
}
发现周围设备:
mManager.discoverPeers(mChannel,new WifiP2pManager.ActionListener(){
    @Override
    public void onSuccess() {


    }
    @Override
    public void onFailure(int reason) {


    }
});
监听状态变化:
@Override
 public void onReceive(final Context context, Intent intent) {
       String action=intent.getAction();
     //P2P功能是否打开
     if(WifiP2pManager.WIFI_P2P_STATE_CHANGED_ACTION.equals(action)){
        
     }
     //可连接peer改变
     else if(WifiP2pManager.WIFI_P2P_PEERS_CHANGED_ACTION.equals(action)){
         if(mManager!=null){
             mManager.requestPeers(mChannel,peerListListener);
         }
     }
     //P2P连接状态改变
     else if(WifiP2pManager.WIFI_P2P_CONNECTION_CHANGED_ACTION.equals(action)){
        
     }
     设备设置改变
     }else if (WifiP2pManager.WIFI_P2P_THIS_DEVICE_CHANGED_ACTION.equals(action)) {
     }
     peerListListener=new WifiP2pManager.PeerListListener() {
         @Override
         public void onPeersAvailable(WifiP2pDeviceList peerlist) {
          //在这里可选择设备进行连接
         }
     };


 }
设备连接方法如下:
private void connectPeer(WifiP2pDevice device) {
    final WifiP2pConfig config = new WifiP2pConfig();
    config.deviceAddress = device.deviceAddress;
    mManager.connect(mChannel, config, new WifiP2pManager.ActionListener() {
        @Override
        public void onSuccess() {
           //连接成功
        }


        @Override
        public void onFailure(int reason) {
            // 连接失败
        }
    });
}
通过以上步骤便可在两台Android设备之间建立连接,若要取得GroupOwner地址,在receiverP2p中的onReceive方法中,当intent.getAction()等于WifiP2pManager.WIFI_P2P_CONNECTION_CHANGED_ACTION时,代表P2P连接状态发生改变,此时可获得IP地址,方法如下:
NetworkInfo info=intent.getParcelableExtra(WifiP2pManager.EXTRA_NETWORK_INFO);
  if(info.isConnected()){
    mManager.requestConnectionInfo(mChannel, new WifiP2pManager.ConnectionInfoListener() {
        @Override
        public void onConnectionInfoAvailable(WifiP2pInfo info) {
            String address=null;
            if(info.groupFormed&&info.isGroupOwner){
                address=info.groupOwnerAddress.getHostAddress().toString();
            }else if(info.groupFormed){
                address=info.groupOwnerAddress.getHostAddress();
            }else {


            }
        }
    });
}else {
    
}
注意:这里取得的ip地址永远是192.168.49.1,查看源码后发现这是info.groupOwnerAddress的默认值,但是这并不影响。在初次发送消息时,非GroupOwner设备将自己的实际ip地址及消息发送到192.168.49.1,GroupOwner设备即可获得另一台设备的ip地址,之后再将自己的ip地址发送给另一台设备,两台设备之间即可自由通信。

 

项目地址:https://github.com/CoderZWei/P2P_chat
 

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值