Home >Java >javaTutorial >Receive UDP Broadcast from PC on Android
This article implements how to receive UDP broadcasts from a PC on your mobile phone.
Let's first complete the code implementation on the PC side., which is very simple.
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()); } }
In the second code block above, askService will start immediatly(the second param) and will continue to exucute function "sendAskMessage()", which boardcast UDP packet, every boardCastConfig.getWAIT_MS() milliseconds. In my code, it repeats every 5s.
Now, you have achieved 50% success.
Before writing our receiving code, we need add some permissions in AndroidMnifest.xml file or your application will not able to run.
Here are the permissions:
<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" />
Then let's create a service in MainActivity, and implement our receiving code in it. By the way, don't forget adding this service in AndroidManifest.xml file.
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"/>
Then we can finish our receiving code. It contains two part.
①create a new thread(I didn't show that in my code, but that's very important, you can't start your application if you left network operation in main thread)
②acquiring multicast lock(this step is extremely important, without this, you can't receive UDP packet)
③receiving UDP packet
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(); }
My results:
The above is the detailed content of Receive UDP Broadcast from PC on Android. For more information, please follow other related articles on the PHP Chinese website!