前段時間要用到JmDNS就去找了些資料,講的也算詳細,但有些問題不是很清晰,這裏附上一份比較詳細的使用說明:
首先,需要Jmdns的library,然後引入
import javax.jmdns.JmDNS; import javax.jmdns.ServiceEvent; import javax.jmdns.ServiceListener; import javax.jmdns.ServiceTypeListener;
private JmDNS mJmdns; private static final String JMDNS_SERVER_TYPE = "_http._tcp.local."; // 服務類型 private WifiManager.MulticastLock lock; // 組播鎖
需要特別注意,對網絡的操作需要開子線程
private class JmdnsAsyncTask extends AsyncTask<String, Integer, Boolean> { @Override protected void onPreExecute() { super.onPreExecute(); lock = mWifiManager.createMulticastLock("multicast.test"); lock.setReferenceCounted(false); lock.acquire(); } @Override protected Boolean doInBackground(String... params) { try { mJmdns = JmDNS.create(); Log.i("JMDNS", "create jmdns"); } catch (IOException e) { e.printStackTrace(); Log.i("JMDNS", "create error"); return false; } return true; } @Override protected void onPostExecute(Boolean result) { super.onPostExecute(result); if (result) { //監聽服務 Log.i("JMDNS", "add servicelistener"); mJmdns.addServiceListener(JMDNS_SERVER_TYPE, mlistener); } } }
監聽服務
ServiceListener mlistener = new ServiceListener() { public void serviceResolved(ServiceEvent ev) { Log.i("JMDNS", "Service resolved:" + " name:" + ev.getInfo().getName() + " port:" + ev.getInfo().getPort() + " IP: " + ev.getInfo().getInetAddresses()[0].getHostAddress()); addDevices(ev.getInfo().getName(), ev.getInfo().getInetAddresses()[0].getHostAddress()); } public void serviceRemoved(ServiceEvent ev) { Log.i("JMDNS", "Service removed:" + ev.getName()); } public void serviceAdded(ServiceEvent event) { Log.i("JMDNS", "request "); mJmdns.requestServiceInfo(event.getType(), event.getName(), 1); } };
最後,使用結束後要釋放資源,註銷服務
private void releaseJmdns() { new Thread(new Runnable() { @Override public void run() { mJmdns.removeServiceListener(JMDNS_SERVER_TYPE, mlistener); try { mJmdns.close(); } catch (IOException e) { e.printStackTrace(); } if (lock != null) { lock.release(); lock = null; } } }); }
以上就是整個JmDNS的使用過程,同時我嘗試自己用Multicast組播做一個接收消息的客戶端,實際調試過程中,像華爲,OPPO這些品牌的手機一直接收不到組播消息,
起初認爲是定製OS關閉了組播功能,最終卻發現跟組播地址有關係,查詢並使用JmDNS的組播地址224.0.0.251後就可以收到組播消息。