欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

要想使用socket進(jìn)行通訊,就必須知道服務(wù)端的IP地址,我使用的是通過(guò)udp局網(wǎng)廣播來(lái)實(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(這里可以寫(xiě)動(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(); 
   } 
  } 
 } 
}

這樣一來(lái)如果移動(dòng)設(shè)備所連接的局網(wǎng)內(nèi)存在socket的服務(wù)端,服務(wù)端就會(huì)接收到客戶端發(fā)出的廣播,然后服務(wù)端再通過(guò)接收到的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)文章

  • Android10 分區(qū)存儲(chǔ)的適配規(guī)則

    Android10 分區(qū)存儲(chǔ)的適配規(guī)則

    Android設(shè)備 在Sdk29己以上推出了分區(qū)存儲(chǔ),類似iOS沙箱。應(yīng)用App 目標(biāo)版本號(hào)為29或以上則需要適配分區(qū)存儲(chǔ),本文將具體的講解適配規(guī)則
    2021-05-05
  • Android 靜默安裝和卸載的方法

    Android 靜默安裝和卸載的方法

    本篇文章主要介紹了Android 靜默安裝和卸載的方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-09-09
  • Android開(kāi)發(fā)判斷一個(gè)app應(yīng)用是否在運(yùn)行的方法詳解

    Android開(kāi)發(fā)判斷一個(gè)app應(yīng)用是否在運(yùn)行的方法詳解

    這篇文章主要介紹了Android開(kāi)發(fā)判斷一個(gè)app應(yīng)用是否在運(yùn)行的方法,結(jié)合實(shí)例形式較為詳細(xì)的分析了Android判斷應(yīng)用運(yùn)行狀態(tài)的相關(guān)操作技巧與注意事項(xiàng),需要的朋友可以參考下
    2017-11-11
  • Android開(kāi)發(fā)之FloatingActionButton懸浮按鈕基本使用、字體、顏色用法示例

    Android開(kāi)發(fā)之FloatingActionButton懸浮按鈕基本使用、字體、顏色用法示例

    這篇文章主要介紹了Android開(kāi)發(fā)之FloatingActionButton懸浮按鈕基本使用、字體、顏色用法,結(jié)合實(shí)例形式分析了Android FloatingActionButton懸浮按鈕的基本功能、布局、使用方法及操作注意事項(xiàng),需要的朋友可以參考下
    2019-03-03
  • Android 屏蔽和捕獲Home鍵的示例代碼

    Android 屏蔽和捕獲Home鍵的示例代碼

    本文主要介紹 Android 屏蔽和捕獲Home 鍵的方法,并附有代碼實(shí)例參考,在開(kāi)發(fā)過(guò)程中可能會(huì)遇到這樣的功能,有需要的同學(xué)可以參考下
    2016-07-07
  • Android手機(jī)保持屏幕高亮方法

    Android手機(jī)保持屏幕高亮方法

    這篇文章主要介紹了Android手機(jī)保持屏幕高亮方法,本文直接給出實(shí)現(xiàn)代碼,需要的朋友可以參考下
    2015-06-06
  • Android實(shí)現(xiàn)波浪球效果

    Android實(shí)現(xiàn)波浪球效果

    這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)波浪球效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-08-08
  • Android中使用OkHttp包處理HTTP的get和post請(qǐng)求的方法

    Android中使用OkHttp包處理HTTP的get和post請(qǐng)求的方法

    OkHttp包為安卓開(kāi)發(fā)中的HTTP協(xié)議網(wǎng)絡(luò)編程帶來(lái)了很大的便利,這里我們就來(lái)看一下最基本的、Android中使用OkHttp包處理HTTP的get和post請(qǐng)求的方法:
    2016-07-07
  • RecyclerView使用詳解(代替ListView)

    RecyclerView使用詳解(代替ListView)

    這篇文章主要為大家詳細(xì)介紹了RecyclerView使用的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-12-12
  • Android Jetpack庫(kù)剖析之Lifecycle組件篇

    Android Jetpack庫(kù)剖析之Lifecycle組件篇

    本章也是帶來(lái)了Jetpack中我認(rèn)為最重要的架構(gòu)組件Lifecycle的原理探索,至于為什么覺(jué)得它是最重要是因?yàn)橄馰iewModel,LiveData這些組件也依賴于Lifecycle來(lái)感知宿主的生命周期,那么本章我們帶著幾個(gè)問(wèn)題來(lái)探索一下這個(gè)組件
    2022-07-07

最新評(píng)論