Android模拟器UDP无法接收; 工作正常的电话(Android Emulator UDP

2019-07-19 17:36发布

您好,我试图连接到一个盒子是在网络上。 它有它的工作UDP服务器。 随着下面的代码,我能够与盒UDP数据包从我的电话沟通和发送/接收。 不过,我可以如何设置使用Android模拟器想不通。 我读过StackOverflow上很多,以及与不是运气其他论坛。 我在Windows 8

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转发NetworkActiv AUTAPF主机外发送数据包。 它发出了我的UDP,但它不不转发响应。 有谁知道我应该在哪里发送目的地回应?

Answer 1:

没有您可以直接在Android模拟器连接到任何东西物理网络上的路。

Android模拟器创建自己的局域网和每个模拟器实例使用相同的IP地址一个新的LAN实例(这是可以的,因为他们不能互相访问)

如果您坚持使用模拟器与Box沟通,你应该在PC上创建一个UDP代理插槽(使用Java,C#,C ++,VB ...或者你想要的任何桌面编程语言)

他们的方式你的桌面应用程序工作原理

  • 让你的局域网子网以后determain数据包的源。
  • 启动UDP监听器端口服务器使用。
  • 找到发送者的IP地址(也有针对API)的发件人是否在仿真器,使用盒IP重新发送数据包箱

有对Android的开发者网站上的主题一个很好的demonistration。

请看看这里

祝好运



文章来源: Android Emulator UDP cannot receive; works fine on phone
标签: android udp