Android学习笔记第五篇--网络连接与云服务(一)

Android学习笔记第五篇–网络连接与云服务

第一章、无线连接设备

​ 除了能够在云端通讯,Android的无线API也允许在同一局域网内的设备通讯,**甚至没有连接网络,而是物理具体相近,也可以相互通讯。**Network Service Discovery 简称NSD可以允许应用相互通讯发现附近设备。

​ 本节主要介绍Android应用发现与连接其他设备的API。主要介绍NSD的API和点对点无线(the Wi-Fi Peer-to-Peer)API。

1、使用网络服务发现(NSD)

添加NSD服务到App中,可以使用户辨识在局域网内支持app请求的设备。有助于更好的实现文件共享、联机游戏等服务需求。

  • 注册NSD服务

    Note:注册NSD服务为非必选项,若是不关注本地网络的广播,则可以不用注册。

    在局域网内注册自身服务首先要创建NsdServiceInfo对象。

    public void registerService(int port){
    //创建并初始化NSD对象
    NsdServiceInfo serviceInfo = new NsdServiceInfo();
    //服务名称要保证唯一性
    serviceInfo.serServiceName("NsdChat");
    //指定协议和传输层,如指定打印服务"_ipp._tcp"
    serviceInfo.setServiceType("_http._tcp.");
    serviceInfo.setPort(port);
    .....
    }

    如上创建了一个NSD服务,并设置了名称、服务类型。其中服务类型制定的是应用使用的协议和传输层。语法是_<protocol>._<transportlayer>

    Note:互联网编号分配机构(International Assigned Numbers Authority)提供用于服务发现协议,如NSD和Bonjour等。

    服务端口号应避免硬代码,以便于可以动态更改端口号,并更新通知。

    public void initializeServerSocket(){
    //初始化一个server socket,指定下面的端口
    mServiceSocket = new ServerSocket(0);
    //存储选择的端口号
    mLocalPort = mServerSocket.getLocalPort();
    ......
    }

    至此已经创建了NsdServiceInfo对象,接着要实现RegistrationListener接口,实现注册功能。

    public void initializeRegistrationListener(){
    mRegistrationListener = new NsdManager.RegistrationListener(){
      @Override
      public void onServiceRegistered(NsdServiceInfo nsdServiceInfo){
        //需要更新已经保存的注册服务名称,因为它需要唯一性,若是命名冲突,Android会自动解决冲突,此处就需要更新获取。
        mServiceName = nsdServiceInfo.getServiceName();
      }
      @Override
      public void onRegistrationFailed(NsdServiceInfo serviceInfo,int errorCode){
       //注册失败时候,在此处可以记录日志 
      }
      @Override
      public void onServiceUnregistered(NsdServiceInfo arg0){
        //注销服务,只有通过NsdManager来注销才会调用这里。
      }
    
      @Override
      public void onUnregistrationFailed(NsdService serviceInfo,int errorCode){
       //注销失败,记录日志 
      }
    };
    }

    因为registerService()方法是异步的,在注册服务之后的操作,需要在onServiceRegistered()方法中进行。

    public void registerService(int port){
    NsdServiceInfo serviceInfo = new NsdServiceInfo();
    serviceInfo.setServiceName("NsdChat");
    serviceInfo.setServiceType("_http._tcp.");
    serviceInfo.setPort(Port);
    
    mNsdManager = Context.getSystemService(Context.NSD_SERVICE);
    mNsdManager.registerService(serviceInfo,NsdManager.PROTOCOL_DNS_SD,mRegistrationListener);
    }
  • 发现网络中的服务

    发现网络服务需要两步:

    • 注册网络监听器
    • 调用discoverServices()异步API

    1、创建NsdManager.DiscoveryListener接口的实现类。

    public void initializeDiscoveryListener(){
    //实例化网络发现监听器
    mDiscoverListener = new NsdManager.DiscoveryListener(){
      //发现服务时候调用该方法
      @Override
      public void onDiscoveryStarted(String regType){
        Log.d(TAG,"Service discovery started");
      }
      @Override
          public void onServiceFound(NsdServiceInfo service) {
              // A service was found!  Do something with it.
              Log.d(TAG, "Service discovery success" + service);
              if (!service.getServiceType().equals(SERVICE_TYPE)) {
                  // Service type is the string containing the protocol and
                  // transport layer for this service.
                  Log.d(TAG, "Unknown Service Type: " + service.getServiceType());
              } else if (service.getServiceName().equals(mServiceName)) {
                  // The name of the service tells the user what they'd be
                  // connecting to. It could be "Bob's Chat App".
                  Log.d(TAG, "Same machine: " + mServiceName);
              } else if (service.getServiceName().contains("NsdChat")){
                  mNsdManager.resolveService(service, mResolveListener);
              }
          }
    
          @Override
          public void onServiceLost(NsdServiceInfo service) {
              // When the network service is no longer available.
              // Internal bookkeeping code goes here.
              Log.e(TAG, "service lost" + service);
          }
    
          
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值