3

您好,我正在尝试连接到网络上的盒子。它上面有一个工作的 UDP 服务器。使用下面的代码,我可以与盒子通信并从我的手机发送/接收 UDP 数据包。但是,我无法弄清楚如何使用 android 模拟器进行设置。我在 StackOverflow 以及其他不走运的论坛上阅读了很多内容。我在 Windows 8

安卓代码:

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*

从安卓模拟器登录:

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,但它不转发响应。有谁知道我应该将目的地响应发送到哪里?

4

2 回答 2

3

您无法将您的 android 模拟器直接连接到网络上的任何物理设备。

Android Emulator 创建自己的LAN,每个模拟器实例创建一个具有相同 IP 的新 LAN 实例(这没关系,因为它们不能互相访问)

如果您坚持使用 Emulator 与 Box 通信,您应该在您的 PC 上创建一个 UDP 代理套接字(使用 JAVA 、 C# 、 C++ 、 VB ... 或任何您想要的桌面编程语言)

它们使您的桌面应用程序工作

  • 让您的 LAN 子网稍后确定数据包源。
  • 为您的服务器使用的端口启动一个 UDP 侦听器。
  • 如果发件人是模拟器,则查找发件人的 IP 地址(有相应的 API),使用盒子 IP 将该数据包重新发送到盒子

在 Android 的开发者网站上有一个很好的演示。

请看这里

祝你好运

于 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

之后,您需要将 localhost 的所需端口重新分配到您的模拟器设备

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

最后,您需要将 UDP 数据包从您的本地 IP 地址 (192.168.1.X) 重新发送到您的 localhost (127.0.0.1),否则模拟设备将不会收到数据包。为此,您可以创建一个简单的 UDP rediriger 或使用我创建的程序来做同样的事情https://github.com/danidis91/Port-forward-UDP

于 2021-12-18T20:15:47.280 回答