[Android] UDP 브로드캐스트 수신하기
2023. 11. 29. 17:02
'DatagramSocket'을 사용하여 UDP 브로드캐스트 메시지를 수신할 수 있습니다.
DatagramSocket 포트는 송신하는 쪽 포트를 적어주시면 됩니다.
- AndroidManifest에서 인터넷 사용 권한을 추가.
<uses-permission android:name="android.permission.INTERNET" />
- UdpBroadcastReceiver를 생성하여 메시지를 수신받는 쓰레드를 생성.
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
public class UdpBroadcastReceiver extends Thread {
private boolean running;
private DatagramSocket socket;
private byte[] buf = new byte[256];
public UdpBroadcastReceiver() {
try {
socket = new DatagramSocket(4445); // 4445 포트에서 수신
socket.setBroadcast(true);
} catch (SocketException e) {
e.printStackTrace();
}
}
public void run() {
running = true;
while (running) {
try {
DatagramPacket packet = new DatagramPacket(buf, buf.length);
socket.receive(packet);
InetAddress address = packet.getAddress();
int port = packet.getPort();
packet = new DatagramPacket(buf, buf.length, address, port);
String received = new String(packet.getData(), 0, packet.getLength());
// 수신된 메시지 처리
Log.d("UdpBroadcastReceiver", "Received Message: " + received);
if (received.equals("end")) {
running = false;
continue;
}
} catch (Exception e) {
e.printStackTrace();
running = false;
}
}
socket.close();
}
}
- 메인에서 해당 쓰레드 실행.
UdpBroadcastReceiver receiver = new UdpBroadcastReceiver();
receiver.start();
수신받은 데이터를 메인에서 처리하려면 콜백 인터페이스를 사용하여 쓰레드가 완료했을 때 콜백을 통해 결과를 전달받을 수 있습니다.
- 콜백 인터페이스 정의.
public interface ThreadCompleteListener {
void onThreadComplete(final String result);
}
- 쓰레드 수정.
쓰레드 작업 완료 시, 콜백 메서드를 호출할 수 있도록 설정.
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
public class UdpBroadcastReceiver extends Thread {
private ThreadCompleteListener listener;
private boolean running;
private DatagramSocket socket;
private byte[] buf = new byte[256];
public UdpBroadcastReceiver(ThreadCompleteListener listener) {
try {
socket = new DatagramSocket(4445); // 4445 포트에서 수신
socket.setBroadcast(true);
} catch (SocketException e) {
e.printStackTrace();
}
}
public void run() {
running = true;
while (running) {
try {
DatagramPacket packet = new DatagramPacket(buf, buf.length);
socket.receive(packet);
InetAddress address = packet.getAddress();
int port = packet.getPort();
packet = new DatagramPacket(buf, buf.length, address, port);
String received = new String(packet.getData(), 0, packet.getLength());
// 수신된 메시지 처리
Log.d("UdpBroadcastReceiver", "Received Message: " + received);
if (received.equals("end")) {
running = false;
continue;
}
} catch (Exception e) {
e.printStackTrace();
running = false;
}
}
socket.close();
}
}
- 메인에서 쓰레드 호출 수정.
UdpBroadcastReceiver receiver = new UdpBroadcastReceiver(this);
receiver.start();
- 메인에서 onThreadComplete으로 쓰레드 결과 처리.
implements 추가
public class MainActivity extends AppCompatActivity implements ThreadCompleteListener {
onThreadComplete
@Override
public void onThreadComplete(String result) {
// 스레드 결과 처리.
runOnUiThread(() -> {
// UI수정할 경우 runOnUiThread 사용.
});
}
'안드로이드 > Android' 카테고리의 다른 글
[Android] Screen ON/OFF 감지 이벤트 (0) | 2021.05.13 |
---|---|
[Android] 인앱업데이트 (0) | 2021.05.12 |
[Android] 앱 다시 실행하기 (0) | 2021.04.06 |
[Android] URL 유효성 체크(마켓에 유효한 앱인지 확인) (0) | 2021.04.01 |
[Android] Handler로 딜레이 주기 (0) | 2021.03.17 |