'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 사용.
        });
    }

 


+ Recent posts