編輯:關於Android編程
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() {
@Override
public void onUnregistrationFailed(NsdServiceInfo arg0, int arg1) {
Toast.makeText(getApplicationContext(), "Unregistration Failed", Toast.LENGTH_SHORT).show();
}
@Override
public void onServiceUnregistered(NsdServiceInfo arg0) {
Toast.makeText(getApplicationContext(), "Service Unregistered", Toast.LENGTH_SHORT).show();
}
@Override
public void onServiceRegistered(NsdServiceInfo arg0) {
Toast.makeText(getApplicationContext(), "Service Registered", Toast.LENGTH_SHORT).show();
}
@Override
public 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() {
@Override
public void onStopDiscoveryFailed(String serviceType, int errorCode) {
Toast.makeText(getApplicationContext(), "Stop Discovery Failed", Toast.LENGTH_SHORT).show();
}
@Override
public void onStartDiscoveryFailed(String serviceType, int errorCode) {
Toast.makeText(getApplicationContext(),
"Start Discovery Failed", Toast.LENGTH_SHORT).show();
}
@Override
public void onServiceLost(NsdServiceInfo serviceInfo) {
Toast.makeText(getApplicationContext(), "Service Lost", Toast.LENGTH_SHORT).show();
}
@Override
public void onServiceFound(NsdServiceInfo serviceInfo) {
// 發現網絡服務時就會觸發該事件
// 可以通過switch或if獲取那些你真正關心的服務
Toast.makeText(getApplicationContext(), "Service Found", Toast.LENGTH_SHORT).show();
}
@Override
public void onDiscoveryStopped(String serviceType) {
Toast.makeText(getApplicationContext(), "Discovery Stopped", Toast.LENGTH_SHORT).show();
}
@Override
public 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() {
@Override
public void onServiceResolved(NsdServiceInfo arg0) {
// 可以再這裡獲取相應網絡服務的地址及端口信息,然後決定是否要與之建立連接。
// 之後就是一些socket操作了
}
@Override
public 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
RecyclerView的萬能分割線
什麼是RecyclerViewRecyclerView是Android 5.0 materials design中的組件之一,相應的還有CardView、Palette等
Android 繪制太極圖實例詳解
Android 繪制太極圖繪制一個太極圖實現代碼:package com.jackie.taijicircle; import android.content.Cont
有話微笑說是什麼 有話微笑說怎麼打電話
有話微笑說是什麼?聽名字就覺得很新奇,這款app之所以這麼火爆,就是因為非常可靠,而且打電話非常便宜,有了它,能夠幫你每個月節省很多話費。有話微笑說怎麼打電
Android 菜單簡析01(OptionsMenu)
Android 的菜單機制,在 Android 3.0 之前和之後有很大的去別,Android 3.0 推出 ActionBar ,導航的 UI 交互有很大的變化,但菜單