1. 程式人生 > >Android 通過UDP廣播建立Socket

Android 通過UDP廣播建立Socket

前言:專案中遇到的實際問題,Android手機想要和區域網中的某個主機進行Socket通訊,但是Socket連線前卻無法獲知該主機的IP, 為了建立Socket,就需要Android手機在區域網內傳送UDP廣播,從而獲得目的主機的IP。

一、 關於 TCP/UDP

專案中主機內建的Wifi模組自帶被搜尋功能:手機(Client)通過UDP廣播發送一個口令,預設口令為:”HF-A11ASSISTHREAD”;Server收到正確的口令,就會向Client回覆自己的IP、MAC、模組名稱

  • 這裡寫圖片描述

    1. TCP是面向連線的協議,正式通訊前需要建立連線,但是如果連對方的ip、port都不知道,是無法建立連線的

    2. UDP是面向非連線的協議,不管對方狀態,直接把包發過去

    3. 兩種協議適用不同的場合

二、Android UDP 程式設計

1. Android UDP 程式設計的 API 的介紹有很多

2. 程式碼

  • 開執行緒,將UDP的收發寫到新的執行緒裡
UDPThread thread = new UDPThread();
Thread udpThread = new Thread(thread);
udpThread.start();  
  • 實現程式碼
// Wifi模組指定的廣播口令,需要轉換成UDP要求的byte格式
byte[] sendBuf="HF-A11ASSISTHREAD"
.getBytes(); try { // 傳送 DatagramSocket sendSocket = new DatagramSocket(); InetAddress broadcastAddress=InetAddress.getByName("192.168.1.255"); DatagramPacket sendPacket=new DatagramPacket(sendBuf,sendBuf.length,broadcastAddress,48899
); sendSocket.send(sendPacket); // 接收 byte[] receiveBuf = new byte[64]; DatagramPacket receivePacket = new DatagramPacket(receiveBuf, receiveBuf.length); sendSocket.receive(receivePacket); // 獲得Wifi模組回覆的自身IP InetAddress address = receivePacket.getAddress(); String data = receivePacket.getData().toString(); System.out.println(address);

3. Log

  • 接收的包裡有很多資訊,我需要用到的就是通過正則表示式匹配提取IP:

這裡寫圖片描述

三、除錯工具

在電腦上測試了手機TCP/UDP報文的收發:

  • 設定Server端

    這裡寫圖片描述

  • 手機發送UDP指令

    這裡寫圖片描述

四、總結

在沒有想到內建Wifi模組還有UDP功能前,還嘗試過用ARP來解決問題。雖然最後選擇了發UDP廣播的捷徑,但是解決問題的過程中學到的很多,可以參考另一篇部落格Android 平臺上的 ARP 和 ARP 欺騙。最後,謝謝在解決問題的過程中幫助過我的小夥伴們(✿◡‿◡)!