Android网络服务发现(NSD)协议的使用
Android的網絡服務發現協議(NSD)能夠用于在小范圍的網絡中發現鄰近設備上的某個應用。這對于一些社交網絡、多人游戲類的應用會很有幫助。
Android的NSD的用法大致上分為四種操作:
1. 注冊網絡服務
2. 發現網絡服務
3. 連接網絡服務
4.?注銷網絡服務
使用NSD時一定要注意:
? ? 記得在Manifest中增加android.permission.INTERNET 權限,不然程序會崩潰。
一. 注冊網絡服務
注冊網絡服務須要兩樣東西: 網絡服務的信息(NsdServiceInfo)和注冊事件監聽器(NsdManager.RegistrationListener)
這兩樣東西齊全后就能夠通過:NsdManager.registerService發放來注冊網絡服務了。
實例代碼例如以下:
public void registerService(View view) {// 注意:注冊網絡服務時不要對端口進行硬編碼,通過例如以下這樣的方式為你的網絡服務獲取// 一個可用的端口號.int port = 0;try {ServerSocket sock = new ServerSocket(0);port = sock.getLocalPort();sock.close();} catch (Exception e) {Toast.makeText(getApplicationContext(), "can not set port", Toast.LENGTH_SHORT);}// 注冊網絡服務的名稱、類型、端口NsdServiceInfo nsdServiceInfo = new NsdServiceInfo();nsdServiceInfo.setServiceName("NSD_Test_Program");nsdServiceInfo.setServiceType("_http._tcp.");nsdServiceInfo.setPort(port);// 實現一個網絡服務的注冊事件監聽器。監聽器的對象應該保存起來以便之后進行注銷nsRegListener = new NsdManager.RegistrationListener() {@Overridepublic void onUnregistrationFailed(NsdServiceInfo arg0, int arg1) {Toast.makeText(getApplicationContext(), "Unregistration Failed", Toast.LENGTH_SHORT).show();}@Overridepublic void onServiceUnregistered(NsdServiceInfo arg0) {Toast.makeText(getApplicationContext(), "Service Unregistered", Toast.LENGTH_SHORT).show();}@Overridepublic void onServiceRegistered(NsdServiceInfo arg0) {Toast.makeText(getApplicationContext(), "Service Registered", Toast.LENGTH_SHORT).show();}@Overridepublic void onRegistrationFailed(NsdServiceInfo arg0, int arg1) {Toast.makeText(getApplicationContext(), "Registration Failed", Toast.LENGTH_SHORT).show();}};// 獲取系統網絡服務管理器,準備之后進行注冊NsdManager nsdManager = (NsdManager) getApplicationContext().getSystemService(Context.NSD_SERVICE);nsdManager.registerService(nsdServiceInfo, NsdManager.PROTOCOL_DNS_SD, nsRegListener); }
注意:registerService()方法是異步運行的,假設有一定要在服務注冊完成后才干運行的操作,請在onServiceResgistered事件中執這些操作。
二. 發現網絡服務
要發現附近的網絡服務須要定義一個網絡服務發現時間監聽器。代碼例如以下:
public void discoverService(View view) {nsDicListener = new NsdManager.DiscoveryListener() {@Overridepublic void onStopDiscoveryFailed(String serviceType, int errorCode) {Toast.makeText(getApplicationContext(), "Stop Discovery Failed", Toast.LENGTH_SHORT).show();}@Overridepublic void onStartDiscoveryFailed(String serviceType, int errorCode) {Toast.makeText(getApplicationContext(),"Start Discovery Failed", Toast.LENGTH_SHORT).show();}@Overridepublic void onServiceLost(NsdServiceInfo serviceInfo) {Toast.makeText(getApplicationContext(), "Service Lost", Toast.LENGTH_SHORT).show();}@Overridepublic void onServiceFound(NsdServiceInfo serviceInfo) {// 發現網絡服務時就會觸發該事件// 能夠通過switch或if獲取那些你真正關心的服務Toast.makeText(getApplicationContext(), "Service Found", Toast.LENGTH_SHORT).show();}@Overridepublic void onDiscoveryStopped(String serviceType) {Toast.makeText(getApplicationContext(), "Discovery Stopped", Toast.LENGTH_SHORT).show();}@Overridepublic void onDiscoveryStarted(String serviceType) {Toast.makeText(getApplicationContext(), "Discovery Started", Toast.LENGTH_SHORT).show();}};NsdManager nsdManager = (NsdManager) getApplicationContext().getSystemService(Context.NSD_SERVICE);nsdManager.discoverServices("_http._tcp", NsdManager.PROTOCOL_DNS_SD,nsDicListener); }三. 連接網絡服務
通過定義一個網絡服務連接時間監聽器來輪詢解析到的網絡服務。能夠進一步獲取該網絡服務的地址和port然后決定是否進行連接,演示樣例代碼:
public void initResolveListener(View view) {nsResolveListener = new NsdManager.ResolveListener() {@Overridepublic void onServiceResolved(NsdServiceInfo arg0) {// 能夠再這里獲取對應網絡服務的地址及port信息,然后決定是否要與之建立連接。// 之后就是一些socket操作了}@Overridepublic void onResolveFailed(NsdServiceInfo arg0, int arg1) {}}; }四. 注銷網絡服務
想要注銷網絡服務,應該事先保存和該網絡服務有關的句柄。通過NsdManager.unregisterService和NsdManager.stopServiceDiscovery方法來注銷網絡服務。實例代碼:
public void unregisterService(View view) {NsdManager nsdManager = (NsdManager) getApplicationContext().getSystemService(Context.NSD_SERVICE);nsdManager.stopServiceDiscovery(nsDicListener); // 關閉網絡發現nsdManager.unregisterService(nsRegListener); // 注銷網絡服務 }假設轉載請注明出處:http://blog.csdn.net/gophers
總結
以上是生活随笔為你收集整理的Android网络服务发现(NSD)协议的使用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2015-12-18 学习心得
- 下一篇: 在新加坡做面试官的经历 (Intervi