本文實現如何在手機上接收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(); }
我的結果:
以上是在 Android 上接收來自 PC 的 UDP 廣播的詳細內容。更多資訊請關注PHP中文網其他相關文章!