3

こんにちは私はネットワーク上にあるボックスに接続しようとしています。動作中のUDPサーバーがあります。以下のコードを使用して、ボックスと通信し、電話からUDPパケットを送受信できます。しかし、Androidエミュレータを使用してセットアップする方法がわかりません。StackOverflowや他のフォーラムで運が悪かったのでたくさん読んだことがあります。私はWindows8を使用しています

Androidコード:

import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;

import android.os.Handler;
import android.util.Log;

public class udp implements Runnable {
    // Private variable
    private String IPServer = "10.0.2.2";           // For Emulator
    //private String IPServer = "255.255.255.255";  // For Phone
    private int portServer = 6286;
    private int portDestin = 4381;

    private InetAddress serverAddr;
    private InetAddress localAddr;
    private DatagramSocket socketSend;
    private DatagramSocket socketList;
    private DatagramPacket packetSend;
    private DatagramPacket packetList;
    private Handler uiHandler;

public udp(){
};

public void send() {

    // Retrieve the server name
    try {
        Log.d("UDP", "Creating InetAddress");
        serverAddr = InetAddress.getByName(IPServer);
    } catch (Exception e) {
        Log.e("UDP", "InetAddress Error:", e);
    }

    // Create UDP sockets
    try {
        Log.d("UDP", "Creating Sockets");
        socketSend = new DatagramSocket(portServer);
        socketList = new DatagramSocket(portDestin);
    }
    catch(Exception e) {
        Log.e("UDP", "DatagramSocket Error:", e);
    }

    // Sets socket to broadcast
    try {
        Log.d("UDP", "SetBroadcast");
        socketSend.setBroadcast(true);
    }
    catch(Exception e) {
        Log.e("UDP", "SetBroadcast Error:", e);
    }

    // Create UDP packets
    try {
        Log.d("UDP", "Creating packets");
        byte[] dataSend = new byte[32];
        byte[] dataRead = new byte[32];
        String msg = "Packet Broadcast";
        dataSend = msg.getBytes();
        packetSend = new DatagramPacket(dataSend, dataSend.length, serverAddr, portDestin);
        packetList = new DatagramPacket(dataRead, dataRead.length, serverAddr, portDestin);
    }
    catch(Exception e) {
        Log.e("UDP", "DatagramPacket Error:", e);
    }

    // Send packet
    try {
        Log.d("UDP", "Sending packet");
        socketSend.send(packetSend);
    }
    catch(Exception e) {
        Log.e("UDP", "Send Error:", e);
    }

    // Receive packet
    Log.d("UDP", "Receiving packet");
    for(int i=0; i<2; i++)
    {
        try {
            socketList.receive(packetList);
        }
        catch(Exception e) {
            Log.e("UDP", "Receive Error:", e);
        }
        String packetRec = new String(packetList.getData());
        Log.d("UDP", "Received: "+packetRec);
    }       

    socketSend.close();
    socketList.close();
}

@Override
public void run() {
    // TODO Auto-generated method stub
}   
}

ネットワーク全体にブロードキャストする必要があります。そのため、私は255.255.255.255を使用していますが、Androidの場合は機能しないことを読み、エミュレーターで設定を開いて、上記のIPを見つけました。

また、redirを移植します

telnet localhost 5554
redir add udp:4381:4381

電話からのログ:

02-11 12:01:09.743: D/UDP(17253): Creating InetAddress
02-11 12:01:09.743: D/UDP(17253): Creating Sockets
02-11 12:01:09.753: D/UDP(17253): SetBroadcast
02-11 12:01:09.753: D/UDP(17253): Creating packets
02-11 12:01:09.753: D/UDP(17253): Sending packet
02-11 12:01:09.753: D/UDP(17253): Receiving packet
02-11 12:01:09.753: D/UDP(17253): Received: Packet Broadcast????????????
02-11 12:01:09.763: D/UDP(17253): Received: ??????PACKETSTUFF???????????fP*

Androidエミュレータからのログ:

02-11 20:00:22.742: D/UDP(1201): Creating InetAddress
02-11 20:00:22.742: D/UDP(1201): Creating Sockets
02-11 20:00:22.752: D/UDP(1201): SetBroadcast
02-11 20:00:22.772: D/UDP(1201): Creating packets
02-11 20:00:22.772: D/UDP(1201): Sending packet
02-11 20:00:22.772: D/UDP(1201): Receiving packet
02-11 20:00:22.772: D/UDP(1201): Received: Packet Broadcast????????????????????

前もって感謝します

アップデート:

現在、エミュレーターがUDPフォワーダーNetworkActivAUTAPFを使用してホストコンピューターの外部にパケットを送信できるように取得しています。UDPを送信しますが、応答を転送しません。宛先の応答をどこに送信すればよいか誰か知っていますか?

4

2 に答える 2

3

Androidエミュレータをネットワーク上の物理的なものに直接接続する方法はありません。

Androidエミュレーターは独自のLANを作成し、各エミュレーターインスタンスは同じIPを持つ新しいLANインスタンスを作成します(相互にアクセスできないため、これで問題ありません)

エミュレータを使用してBoxと通信する場合は、PC上にUDPプロキシソケットを作成する必要があります(JAVA、C#、C ++、VB ...または任意のデスクトッププログラミング言語を使用)

デスクトップアプリの動作方法

  • 後でパケットソースを抑止するためにLANサブネットを取得します。
  • サーバーが使用するポートのUDPリスナーを起動します。
  • 送信者がエミュレーターである場合は、送信者のIPアドレスを見つけます(そのためのAPIがあります)。ボックスIPを使用してそのパケットをボックスに再送信します。

Androidの開発者向けWebサイトには、このテーマに関する優れたデモンストレーションがあります。

こちらをご覧ください

幸運を

于 2013-02-11T20:27:30.337 に答える
0

同じ問題が発生しましたが、問題はAndroidエミュレーターのリダイレクトとバグが原因であることがわかりました。

まず、API 25以上のレベルのAndroidエミュレータデバイスを使用する場合は、「AndroidWifi」機能なしでデバイスを起動する必要があります。そうしないと、バグhttps://のためにデバイスと通信できなくなります。 issuetracker.google.com/issues/37095198

これを行うために:

cd "C:\Program Files (x86)\Android\android-sdk\emulator"
emulator.exe -avd <name+of+your+device> -feature -Wifi

その後、ローカルホストの目的のポートをエミュレータデバイスに再接続する必要があります

telnet localhost 5554
auth <your+code+here>
redir add udp:<origin+port>:<destination+port>

最後に、UDPパケットをローカルIPアドレス(192.168.1.X)からyout localhost(127.0.0.1)に再接続する必要があります。そうしないと、エミュレートされたデバイスはパケットを受信しません。これを行うには、単純なUDP redirigerを作成するか、私が作成したプログラムを使用して同じことを行うことができますhttps://github.com/danidis91/Port-forward-UDP

于 2021-12-18T20:15:47.280 に答える