最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Android編程實(shí)現(xiàn)基于局域網(wǎng)udp廣播自動(dòng)建立socket連接的方法

 更新時(shí)間:2015年11月18日 15:30:44   作者:luoboo525  
這篇文章主要介紹了Android編程實(shí)現(xiàn)基于局域網(wǎng)udp廣播自動(dòng)建立socket連接的方法,涉及Android使用udp廣播實(shí)現(xiàn)socket通訊的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下

本文實(shí)例講述了Android編程實(shí)現(xiàn)基于局域網(wǎng)udp廣播自動(dòng)建立socket連接的方法。分享給大家供大家參考,具體如下:

android開發(fā)中經(jīng)常會(huì)用到socket通訊。由于項(xiàng)目需要,最近研究了一下這方面的知識(shí)。 需求是想通過wifi實(shí)現(xiàn)android移動(dòng)設(shè)備和android平臺(tái)的電視之間的文件傳輸與控制。 毫無疑問這中間一定需要用到socket來進(jìn)行通信。今天就兩臺(tái)設(shè)備的握手連接方式分享一下吧,該方法只是本人個(gè)人想法的實(shí)現(xiàn),僅供參考,如有雷同,不勝榮幸。

要想使用socket進(jìn)行通訊,就必須知道服務(wù)端的IP地址,我使用的是通過udp局網(wǎng)廣播來實(shí)現(xiàn)局網(wǎng)內(nèi)服務(wù)端的搜尋建立連接。以下是代碼實(shí)現(xiàn)。

首先是客戶端:

public class MainActivity extends Activity { 
 /*發(fā)送廣播端的socket*/ 
 private MulticastSocket ms; 
 /*發(fā)送廣播的按鈕*/ 
 private Button sendUDPBrocast; 
 @Override 
 public void onCreate(Bundle savedInstanceState) { 
  super.onCreate(savedInstanceState); 
  init(); 
 } 
 /*初始化參數(shù)*/ 
 public void init() { 
  setContentView(R.layout.main); 
  sendUDPBrocast = (Button) findViewById(R.id.send); 
  sendUDPBrocast.setOnClickListener(new SendUDPBrocastListener()); 
  try { 
   /*創(chuàng)建socket實(shí)例*/ 
   ms = new MulticastSocket(); 
  } catch (Exception e) { 
   e.printStackTrace(); 
  } 
 } 
 /** 
  * 單擊按鈕時(shí),發(fā)送局域網(wǎng)廣播 
  * */ 
 class SendUDPBrocastListener implements OnClickListener{ 
  @Override 
  public void onClick(View v) { 
   //發(fā)送的數(shù)據(jù)包,局網(wǎng)內(nèi)的所有地址都可以收到該數(shù)據(jù)包 
   DatagramPacket dataPacket = null; 
   try { 
    ms.setTimeToLive(4); 
    //將本機(jī)的IP(這里可以寫動(dòng)態(tài)獲取的IP)地址放到數(shù)據(jù)包里,其實(shí)server端接收到數(shù)據(jù)包后也能獲取到發(fā)包方的IP的 
    byte[] data = "192.168.1.101".getBytes(); 
    //224.0.0.1為廣播地址 
    InetAddress address = InetAddress.getByName("224.0.0.1"); 
    //這個(gè)地方可以輸出判斷該地址是不是廣播類型的地址 
    System.out.println(address.isMulticastAddress()); 
    dataPacket = new DatagramPacket(data, data.length, address, 
      8003); 
    ms.send(dataPacket); 
    ms.close(); 
   } catch (Exception e) { 
    e.printStackTrace(); 
   } 
  } 
 } 
} 

以下是服務(wù)端:

public class MainActivity extends Activity implements Runnable { 
 private MulticastSocket ds; 
 String multicastHost="224.0.0.1"; 
 InetAddress receiveAddress; 
 @Override 
 public void onCreate(Bundle savedInstanceState) { 
  super.onCreate(savedInstanceState); 
  setContentView(R.layout.main); 
  try { 
   ds = new MulticastSocket(8003); 
   receiveAddress=InetAddress.getByName(multicastHost); 
   ds.joinGroup(receiveAddress); 
   new Thread(this).start(); 
  } catch (Exception e1) { 
   // TODO Auto-generated catch block 
   e1.printStackTrace(); 
  } 
 } 
 @Override 
 public void run() { 
  // TODO Auto-generated method stub 
  byte buf[] = new byte[1024]; 
  DatagramPacket dp = new DatagramPacket(buf, 1024); 
  while (true) { 
   try { 
    ds.receive(dp); 
    //Toast.makeText(this, new String(buf, 0, dp.getLength()), Toast.LENGTH_LONG); 
    System.out.println("client ip : "+new String(buf, 0, dp.getLength())); 
   } catch (Exception e) { 
    e.printStackTrace(); 
   } 
  } 
 } 
}

這樣一來如果移動(dòng)設(shè)備所連接的局網(wǎng)內(nèi)存在socket的服務(wù)端,服務(wù)端就會(huì)接收到客戶端發(fā)出的廣播,然后服務(wù)端再通過接收到的IP與客戶端進(jìn)行連接進(jìn)而就可以進(jìn)行控制及文件的傳輸了。需要注意的是,udp廣播會(huì)導(dǎo)致局網(wǎng)傳輸速度變慢,而且udp為不可靠協(xié)議,發(fā)出的廣播服務(wù)端不一定都能夠收到,所以在實(shí)際情況中需要做很多邏輯處理,比如在線程里發(fā)廣播直到收到服務(wù)端的回應(yīng) 但如果局網(wǎng)內(nèi)不存在服務(wù)端就會(huì)陷入死循環(huán),所以這時(shí)就要做限時(shí)操作了等等。。。 具體的看個(gè)人需求而言了吧。

希望本文所述對(duì)大家Android程序設(shè)計(jì)有所幫助。

相關(guān)文章

最新評(píng)論

红安县| 揭东县| 仙居县| 桃园市| 满城县| 定陶县| 航空| 秀山| 荣昌县| 穆棱市| 平江县| 饶平县| 诏安县| 交口县| 兴宁市| 恩施市| 布拖县| 桐庐县| 周至县| 泸定县| 锦州市| 黔东| 茂名市| 梅河口市| 共和县| 广汉市| 河津市| 新干县| 林周县| 南充市| 宜宾市| 永安市| 台东市| 阿瓦提县| 城市| 台湾省| 新疆| 饶平县| 东莞市| 长海县| 奉节县|