Android网络服务发现(NSD)协议的使用
Android的網(wǎng)絡(luò)服務(wù)發(fā)現(xiàn)協(xié)議(NSD)能夠用于在小范圍的網(wǎng)絡(luò)中發(fā)現(xiàn)鄰近設(shè)備上的某個(gè)應(yīng)用。這對于一些社交網(wǎng)絡(luò)、多人游戲類的應(yīng)用會很有幫助。
Android的NSD的用法大致上分為四種操作:
1. 注冊網(wǎng)絡(luò)服務(wù)
2. 發(fā)現(xiàn)網(wǎng)絡(luò)服務(wù)
3. 連接網(wǎng)絡(luò)服務(wù)
4.?注銷網(wǎng)絡(luò)服務(wù)
使用NSD時(shí)一定要注意:
? ? 記得在Manifest中增加android.permission.INTERNET 權(quán)限,不然程序會崩潰。
一. 注冊網(wǎng)絡(luò)服務(wù)
注冊網(wǎng)絡(luò)服務(wù)須要兩樣?xùn)|西: 網(wǎng)絡(luò)服務(wù)的信息(NsdServiceInfo)和注冊事件監(jiān)聽器(NsdManager.RegistrationListener)
這兩樣?xùn)|西齊全后就能夠通過:NsdManager.registerService發(fā)放來注冊網(wǎng)絡(luò)服務(wù)了。
實(shí)例代碼例如以下:
public void registerService(View view) {// 注意:注冊網(wǎng)絡(luò)服務(wù)時(shí)不要對端口進(jìn)行硬編碼,通過例如以下這樣的方式為你的網(wǎng)絡(luò)服務(wù)獲取// 一個(gè)可用的端口號.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);}// 注冊網(wǎng)絡(luò)服務(wù)的名稱、類型、端口NsdServiceInfo nsdServiceInfo = new NsdServiceInfo();nsdServiceInfo.setServiceName("NSD_Test_Program");nsdServiceInfo.setServiceType("_http._tcp.");nsdServiceInfo.setPort(port);// 實(shí)現(xiàn)一個(gè)網(wǎng)絡(luò)服務(wù)的注冊事件監(jiān)聽器。監(jiān)聽器的對象應(yīng)該保存起來以便之后進(jìn)行注銷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();}};// 獲取系統(tǒng)網(wǎng)絡(luò)服務(wù)管理器,準(zhǔn)備之后進(jìn)行注冊NsdManager nsdManager = (NsdManager) getApplicationContext().getSystemService(Context.NSD_SERVICE);nsdManager.registerService(nsdServiceInfo, NsdManager.PROTOCOL_DNS_SD, nsRegListener); }
注意:registerService()方法是異步運(yùn)行的,假設(shè)有一定要在服務(wù)注冊完成后才干運(yùn)行的操作,請?jiān)趏nServiceResgistered事件中執(zhí)這些操作。
二. 發(fā)現(xiàn)網(wǎng)絡(luò)服務(wù)
要發(fā)現(xiàn)附近的網(wǎng)絡(luò)服務(wù)須要定義一個(gè)網(wǎng)絡(luò)服務(wù)發(fā)現(xiàn)時(shí)間監(jiān)聽器。代碼例如以下:
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) {// 發(fā)現(xiàn)網(wǎng)絡(luò)服務(wù)時(shí)就會觸發(fā)該事件// 能夠通過switch或if獲取那些你真正關(guān)心的服務(wù)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); }三. 連接網(wǎng)絡(luò)服務(wù)
通過定義一個(gè)網(wǎng)絡(luò)服務(wù)連接時(shí)間監(jiān)聽器來輪詢解析到的網(wǎng)絡(luò)服務(wù)。能夠進(jìn)一步獲取該網(wǎng)絡(luò)服務(wù)的地址和port然后決定是否進(jìn)行連接,演示樣例代碼:
public void initResolveListener(View view) {nsResolveListener = new NsdManager.ResolveListener() {@Overridepublic void onServiceResolved(NsdServiceInfo arg0) {// 能夠再這里獲取對應(yīng)網(wǎng)絡(luò)服務(wù)的地址及port信息,然后決定是否要與之建立連接。// 之后就是一些socket操作了}@Overridepublic void onResolveFailed(NsdServiceInfo arg0, int arg1) {}}; }四. 注銷網(wǎng)絡(luò)服務(wù)
想要注銷網(wǎng)絡(luò)服務(wù),應(yīng)該事先保存和該網(wǎng)絡(luò)服務(wù)有關(guān)的句柄。通過NsdManager.unregisterService和NsdManager.stopServiceDiscovery方法來注銷網(wǎng)絡(luò)服務(wù)。實(shí)例代碼:
public void unregisterService(View view) {NsdManager nsdManager = (NsdManager) getApplicationContext().getSystemService(Context.NSD_SERVICE);nsdManager.stopServiceDiscovery(nsDicListener); // 關(guān)閉網(wǎng)絡(luò)發(fā)現(xiàn)nsdManager.unregisterService(nsRegListener); // 注銷網(wǎng)絡(luò)服務(wù) }假設(shè)轉(zhuǎn)載請注明出處:http://blog.csdn.net/gophers
總結(jié)
以上是生活随笔為你收集整理的Android网络服务发现(NSD)协议的使用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2015-12-18 学习心得
- 下一篇: 在新加坡做面试官的经历 (Intervi