[android開発] UDPパケットの送受信はUIスレッドとは別スレッドで行う必要あり

Pocket

齢40を前にして、androidでの開発を初めてすることになりました。初体験です。ドキドキです。そして、さっそく初めての難問にあたりました。それは、UDPパケットの送信で意味不明な例外が発生しパケットを送信することができないといったものでした。

スポンサーリンク

UDPパケットの送受信はUIスレッドとは別スレッドで!

もったいぶっても仕方がありませんので結論です。UIスレッドとは別スレッドで送受信は行う必要があるようです。「なんじゃそりゃ」って感じです。

次のように、UIスレッドとは別スレッドで送受信をすることで、意味不明な例外エラーとなることなく、送受信ができました。

UIスレッド上でUDPパケットを送信しようとすると、例外が発生しますが、メッセージは null であり、いきなり迷宮に迷い込みました。。。(涙)


    // 受信スレッド
    new Thread(new Runnable() {
        @Override
        public void run() {
        
            try {

                // UDPパケット待ち受け
                DatagramSocket recvUdpSocket = new DatagramSocket(12345);

                byte[] buffer = new byte[2048];
                DatagramPacket packet = new DatagramPacket(buffer, buffer.length);

                // 受信するまでブロック
                recvUdpSocket.receive(packet);

                // 受信したデータをテキストで出力
                String result = new String(buffer, "UTF-8");
                System.out.println("受信:" + result);

            } catch (IOException e) {
                System.out.println(e.getMessage());
            }
        }
    }).start();

    // 送信スレッド
    new Thread(new Runnable() {
        @Override
        public void run() {
        
            try {
                // ソケットオープン
                DatagramSocket sendUdpSocket = new DatagramSocket();
                // ブロードキャストで送信する(特に意味はない)
                // ブロードキャストの送受信は基本的に可能
                InetAddress IPAddress = InetAddress.getByName("192.168.24.255");
                String str = "送信するテキストデータ";
                byte[] strByte = str.getBytes("UTF-8");

                // 送信先と送信データを設定
                DatagramPacket sendPacket = new DatagramPacket(strByte, strByte.length, IPAddress, 12345);

                // テキストデータを送信
                sendUdpSocket.send(sendPacket);
                // ソケットを閉じる
                sendUdpSocket.close();

            } catch (IOException e) {

                System.out.println(e.getMessage());
            }
        }
    }).start();

 

スポンサーリンク


Pocket

Leave a Comment

Your email address will not be published. Required fields are marked *