java - 无法在 Android 上接收 UDP 数据包?

标签 java android sockets udp broadcastreceiver

我尝试在Android 上实现UDP 服务器,我可以向服务器发送数据包,但收不到。我也试过在没有安卓的情况下运行接收器,它有效。问题出在哪里?

用于测试的本地发件人:

int send_packet(uint8_t* data) {
    int retcode;
    int socket_out;
    int broadcast = 1;
    struct sockaddr_in addr;

    socket_out = socket(AF_INET, SOCK_DGRAM, 0);
    if ( socket_out < 0 )
        return -1;

    setsockopt(socket_out, SOL_SOCKET, SO_BROADCAST, &broadcast, sizeof broadcast);

    memset(&addr, 0, sizeof(addr));
    addr.sin_family = AF_INET;
    addr.sin_addr.s_addr = htonl(INADDR_BROADCAST);
    addr.sin_port=htons(PORT_NUMBER);

    retcode = sendto(socket_out, data, sizeof(packet_data_t), 0,
        (struct sockaddr *) &addr, sizeof(addr));
    perror("sendto");

    close(socket_out);

    return 0;
}

Android 接收器:

public void run(){
   try {
       byte[] buffer = new byte[BUFFER_SIZE];
       DatagramSocket socket = new DatagramSocket(getPort());
       //socket.setBroadcast(true);
       while(true){
           DatagramPacket packet = new DatagramPacket(buffer, buffer.length );
           socket.receive(packet);
           (new CallbackWrapper(getPacketReciever())).run();
       }
    } catch (IOException e) {
        e.printStackTrace();
    }
}

ps 我在 HTC Legend 上运行我的应用程序,而不是在模拟器上

最佳答案

主要问题出在这一行:

DatagramSocket socket = new DatagramSocket(getPort());

你假设设备的本地主机与机器/计算机相同,但是设备有自己的网卡,因此在任何网络中都有自己的IP,并且有自己的网络地址IP,即他自己。仅通过您机器的一个端口无法访问该设备。

关于java - 无法在 Android 上接收 UDP 数据包?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5356527/

相关文章:

java - Maven:无法解析依赖项(未找到 Artifact )

java - 有 Intent 地在 2 个 Activity 之间传递数组

c# - 客户端通常在几十分钟后与服务器断开连接

java - 是否应该在支持套接字关闭之前关闭 Java 流?

java - 计算 0 的阶乘导致 NoSuchElementException

java - 在 Android (Java) 中关闭输入流

java - 在 Javafx 中插入 Pane

android - 权限仅授予系统应用程序,在 list 中

android - 如何在 Android 中使用 Intent 显示 ProgressDialog?

ruby-on-rails - Rails App 中的持久 TCP 连接