首頁 >Java >java教程 >在 Android 上接收來自 PC 的 UDP 廣播

在 Android 上接收來自 PC 的 UDP 廣播

Susan Sarandon
Susan Sarandon原創
2025-01-02 19:27:38845瀏覽

本文實現如何在手機上接收PC端的UDP廣播。
我們先完成PC端的程式碼實現,很簡單。

private final ScheduledExecutorService askService= Executors.newSingleThreadScheduledExecutor();
public void runWaitConnectThead(){
        askService.scheduleAtFixedRate(this::sendAskMessage, 0, boardCastConfig.getWAIT_MS(), TimeUnit.MILLISECONDS);
    }
protected void sendAskMessage(){
        byte[] message = this.hostName.getBytes();
        try (DatagramSocket datagramSocket = new DatagramSocket()) {
            datagramSocket.setBroadcast(true);
            InetAddress boardcastAddr = InetAddress.getByName("255.255.255.255");
            DatagramPacket datagramPacket = new DatagramPacket(message, message.length, boardcastAddr, 1885);
            datagramSocket.send(datagramPacket);
        } catch (IOException e) {
            System.out.println("Error: " + e.getMessage());
        }
    }

在上面的第二個程式碼區塊中,askService 將立即啟動(第二個參數),並繼續執行函數“sendAskMessage()”,該函數會廣播 UDP 封包,每隔 boardCastConfig.getWAIT_MS() 毫秒。在我的程式碼中,它每 5 秒重複一次。

現在,你已經取得了50%的成功。
在編寫接收程式碼之前,我們需要在 AndroidMnifest.xml 檔案中添加一些權限,否則您的應用程式將無法運作。
以下是權限:

    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
    <uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE" />

然後我們在MainActivity中建立一個服務,並在其中實作我們的接收程式碼。順便說一句,不要忘記在 AndroidManifest.xml 檔案中新增此服務。

public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Intent waitBoardCastService=new Intent(this, WaitBoardCastService.class);
        startService(waitBoardCastService);
    }
}
<service android:name=".on_wait.WaitBoardCastService"/>

然後我們就可以完成我們的接收程式碼了。它包含兩個部分。
①創建一個新線程(我沒有在我的程式碼中顯示這一點,但這非常重要,如果你將網路操作留在主執行緒中,你將無法啟動你的應用程式)
②取得組播鎖(這一步驟極為重要,沒有這一步驟就收不到UDP封包)
③接收UDP封包

WifiManager wifi =(WifiManager)getSystemService(MyApplication.WIFI_SERVICE);
WifiManager.MulticastLock lock = wifi.createMulticastLock("any_tag");
lock.acquire();
try {
    DatagramSocket socket = new DatagramSocket(1885);
    byte[] receiveData = new byte[1024];
    DatagramPacket receivePacket = new DatagramPacket(receiveData, 
    receiveData.length);
    Log.v("hello","waiting");
    socket.receive(receivePacket);
    String receiveMessage = new String(receivePacket.getData(), 0,receivePacket.getLength());
    Log.v("hello","received!");
    socket.close();
} catch (IOException e) {
    Toast.makeText(MyApplication.getContext(), "NetWork Error",Toast.LENGTH_LONG).show();
} finally {
    lock.release();
}

我的結果:

Receive UDP Broadcast from PC on Android

以上是在 Android 上接收來自 PC 的 UDP 廣播的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn