首页 >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