本文实现了如何在手机上接收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中文网其他相关文章!