이 글에서는 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는 즉시 시작되고(두 번째 매개변수) 밀리초마다 UDP 패킷을 보드캐스트하는 "sendAskMessage()" 함수를 계속 실행합니다. 내 코드에서는 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!