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); }