Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Android单播UDP工作,但广播不工作';T_Java_Android_Python_Udp - Fatal编程技术网

Java Android单播UDP工作,但广播不工作';T

Java Android单播UDP工作,但广播不工作';T,java,android,python,udp,Java,Android,Python,Udp,对于一项任务,我们尝试设置多个Android设备,通过本地WiFi网络从笔记本电脑接收UDP广播 工作原理: 两台笔记本电脑上的Python终端能够相互发送和接收UDP广播或单播 Android设备可以接收直接发送到其IP的UDP消息 什么不起作用: Android设备(LG/Google Nexus 4)未接收UDP广播消息(另一台运行Python的笔记本电脑接收) 有什么建议吗?以下是我们每个组件的来源(无耻地从互联网上借用) Python接收广播 import select, so

对于一项任务,我们尝试设置多个Android设备,通过本地WiFi网络从笔记本电脑接收UDP广播

工作原理:

  • 两台笔记本电脑上的Python终端能够相互发送和接收UDP广播或单播
  • Android设备可以接收直接发送到其IP的UDP消息
什么不起作用:

  • Android设备(LG/Google Nexus 4)未接收UDP广播消息(另一台运行Python的笔记本电脑接收)
有什么建议吗?以下是我们每个组件的来源(无耻地从互联网上借用)

Python接收广播

import select, socket

port = 50000
bufferSize = 1024

ip = '0.0.0.0'

s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.bind((ip, port))

while True:
    msg, result = s.recvfrom(bufferSize)
    pr

int "Received message: ", msg
# Send UDP broadcast packets

port = 50000

import sys, time
from socket import *

s = socket(AF_INET, SOCK_DGRAM)
s.setsockopt(SOL_SOCKET, SO_BROADCAST, 1)

data = repr(time.time()) + '\n'
s.sendto(data, ('192.168.1.255', port))
Python发送广播

import select, socket

port = 50000
bufferSize = 1024

ip = '0.0.0.0'

s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.bind((ip, port))

while True:
    msg, result = s.recvfrom(bufferSize)
    pr

int "Received message: ", msg
# Send UDP broadcast packets

port = 50000

import sys, time
from socket import *

s = socket(AF_INET, SOCK_DGRAM)
s.setsockopt(SOL_SOCKET, SO_BROADCAST, 1)

data = repr(time.time()) + '\n'
s.sendto(data, ('192.168.1.255', port))
Android

private void receiveUDP() {
    final String[] text = new String[1];
    final int server_port = 50000;
    // create buffer
    final byte[] message = new byte[1500];
    final DatagramPacket p = new DatagramPacket(message, message.length);

    // listen for message, put in buffer
    new Thread(new Runnable() {
        @Override
        public void run() {
            try {
                while (true) {
                    Log.d(Main.class.getName(), "Created socket");
                    DatagramSocket s = new DatagramSocket(server_port);
                    s.receive(p);
                    text[0] = new String(message, 0, p.getLength());
                    Log.d(Main.class.getName(), "message:" + text[0]);
                    s.close();
                }
            } catch (IOException e) {
                Log.e(this.getClass().getName(), "An unexpected error occurred", e);
            }
        }
    }).start();
}
重申一下,唯一不起作用的是在Android上接收UDP广播——它可以接收到IP上的单个UDP消息,Python终端确实从另一台笔记本电脑接收UDP广播

有什么建议吗

更新

我知道我们应该使用多播锁——我现在已经试过了,但仍然不起作用。这是新的Android代码:

private void receiveUDP() {
    final String[] text = new String[1];
    final int server_port = 50001;
    // create buffer
    final byte[] message = new byte[1500];
    final DatagramPacket p = new DatagramPacket(message, message.length);

    // listen for message, put in buffer
    new Thread(new Runnable() {
        @Override
        public void run() {
            DatagramSocket s = null;
                while (true) {
                    try{
                        WifiManager wifi = (WifiManager) getSystemService(Context.WIFI_SERVICE);
                        WifiManager.MulticastLock lock = wifi.createMulticastLock("Main");
                        lock.acquire();
                        s = new DatagramSocket(server_port, InetAddress.getByName("192.168.1.13"));
                        Log.d(Main.class.getName(), "Created socket");
                            s.receive(p);
                        lock.release();
                        text[0] = new String(message, 0, p.getLength());
                        Log.d(Main.class.getName(), "message:" + text[0]);
                        runOnUiThread(new Runnable() {
                            @Override
                            public void run() {
                                Toast.makeText(context, "Received message: "+text[0], Toast.LENGTH_SHORT).show();
                            }
                        });
                    } catch (SocketException e) {
                        Log.e(Main.class.getName(), "An unexpected error occurred", e);
                    } catch (IOException e) {
                        Log.e(Main.class.getName(), "An unexpected error occurred", e);
                    } finally {
                        if (s != null) s.close();
                        Log.d(Main.class.getName(), "Closing socket");
                    }
                }
        }
    }).start();
}

似乎有些手机,包括Nexus4,锁定了UDP接收广播功能。解决办法是使用不同的电话。例如,它适用于价格低廉的华为G300,我也在尝试这样做。你想出来了吗?我真的想出来了。代码很好,但包括Nexus4在内的一些手机锁定了UDP接收广播功能。解决办法是使用不同的电话。例如,它在廉价的华为G300上工作,全新的Nexus 5似乎也有同样愚蠢的问题。。。。这与运营商无关,因为它是谷歌PlayStore的解锁设备。谢谢Alex的回复。我想知道更多关于这方面的信息,有链接吗?