1

Android で UDP を使用してデータを受信する際に、非常に奇妙な問題に直面しています。Android デバイスから wifi モジュールを制御するアプリケーションを作成しています。このリモート Wi-Fi デバイスにデータを正常に送信できます。しかし、この Wi-Fi デバイスから「完全な」データ パケットを受信できません。

アンドロイドの私のコードは次のとおりです。

public static void receivePacket(int receiverPort, Context context) {
    DatagramSocket socket = null;
    String text = "";
    try {           
        byte[] message = new byte[1500];
        DatagramPacket packet = new DatagramPacket(message, message.length);
        socket = new DatagramSocket(receiverPort);          
        //socket.setSoTimeout(5000);
        for (int i = 0; i < 12; i++) {
            socket.receive(packet);
            text += new String(message, 0, packet.getLength()) + "\n";
        }
        socket.close();
        Log.d("Received Message", text);
    } catch (Exception e) {
        Log.e("UDP", "S: Error", e);
    } finally {
        if(null != socket){
            socket.close();
        }
    }
}

したがって、データ「$BEG1;$PID2;$PIP192.168.15.245;$PPN80;$DAT987654321;$END1;」を期待している場合 「$BEG1;$PID2;$PIP192.168.15.245;$PPN80;$DAT98」しか表示されない

UDP WinChat アプリケーションを使用して、wifi モジュールからメッセージを取得でき、データ全体を取得できるかどうかを確認しようとしました。

また、UDP Win Chat アプリケーションを使用して非常に長いメッセージを Android デバイスに送信しようとすると、データ全体を取得できます!

私は完全に混乱しています!助けてください。


問題を切り分けることができました。(ただし、まだ修正が見つかりません:(...)

上記のコードから、受信したデータに応じて毎回変更されると仮定して、反復ごとに同じ packet.getLength() を使用しています。しかし、残念ながら、それは期待される動作ではありません。getLength() は以前の値を利用し、新しく到着したメッセージを切り捨てます。[注: これはランダムな動作であり、常に発生するわけではありません]

問題は、ループ内で新しいメッセージを受信するたびに、この属性を変更または更新するにはどうすればよいかということです。

4

1 に答える 1