国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > Android > 正文

Android編程實現基于局域網udp廣播自動建立socket連接的方法

2020-04-11 11:16:24
字體:
來源:轉載
供稿:網友

本文實例講述了Android編程實現基于局域網udp廣播自動建立socket連接的方法。分享給大家供大家參考,具體如下:

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

要想使用socket進行通訊,就必須知道服務端的IP地址,我使用的是通過udp局網廣播來實現局網內服務端的搜尋建立連接。以下是代碼實現。

首先是客戶端:

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

以下是服務端:

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

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

希望本文所述對大家Android程序設計有所幫助。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 娱乐| 名山县| 朝阳县| 萍乡市| 江源县| 清丰县| 吉安市| 亚东县| 陆川县| 高州市| 望都县| 西丰县| 大兴区| 新绛县| 岐山县| 白玉县| 桃江县| 双江| 左贡县| 邢台县| 河津市| 玛曲县| 栾川县| 韶关市| 平乐县| 苗栗市| 普格县| 丘北县| 双江| 天峨县| 金塔县| 乌拉特中旗| 齐河县| 宾川县| 建宁县| 沾益县| 保山市| 红原县| 军事| 府谷县| 屏南县|