Android網路服務發現(NSD)協議的使用

來源:互聯網
上載者:User

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


三. 串連網路服務

通過定義一個網路服務連線時間監聽器來輪詢解析到的網路服務,可以進一步擷取該網路服務的地址和連接埠然後決定是否進行串連,範例程式碼:

public void initResolveListener(View view) {nsResolveListener = new NsdManager.ResolveListener() {@Overridepublic void onServiceResolved(NsdServiceInfo arg0) {// 可以再這裡擷取相應網路服務的地址及連接埠資訊,然後決定是否要與之建立串連。// 之後就是一些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




聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.