Android 通過UDP廣播建立Socket
阿新 • • 發佈:2019-01-01
前言:專案中遇到的實際問題,Android手機想要和區域網中的某個主機進行Socket通訊,但是Socket連線前卻無法獲知該主機的IP, 為了建立Socket,就需要Android手機在區域網內傳送UDP廣播,從而獲得目的主機的IP。
一、 關於 TCP/UDP
專案中主機內建的Wifi模組自帶被搜尋功能:手機(Client)通過UDP廣播發送一個口令,預設口令為:”HF-A11ASSISTHREAD”;Server收到正確的口令,就會向Client回覆自己的IP、MAC、模組名稱
-
TCP是面向連線的協議,正式通訊前需要建立連線,但是如果連對方的ip、port都不知道,是無法建立連線的
UDP是面向非連線的協議,不管對方狀態,直接把包發過去
兩種協議適用不同的場合
二、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 欺騙。最後,謝謝在解決問題的過程中幫助過我的小夥伴們(✿◡‿◡)!