Java Android UDP不';在某些设备中无法接收

Java Android UDP不';在某些设备中无法接收,java,android,multithreading,udp,send,Java,Android,Multithreading,Udp,Send,我有一个UDP发送和接收,它在我的设备三星Galaxy Ace Plus(S7500)中工作,但相同的代码在其他设备中不工作,例如三星Galaxy S4。我没有任何错误 发送: public class SendThread extends Thread { byte[] receiveData = new byte[1024]; DatagramSocket serverSocket = null; public SendThread() { this.start(); } p

我有一个UDP发送和接收,它在我的设备三星Galaxy Ace Plus(S7500)中工作,但相同的代码在其他设备中不工作,例如三星Galaxy S4。我没有任何错误

发送:

public class SendThread extends Thread {

byte[] receiveData = new byte[1024];
DatagramSocket serverSocket = null;


public SendThread() {
    this.start();
}

public void run() {
    DatagramSocket serverSocket = null;
    byte[] receiveData = new byte[1024];
    byte[] sendData = new byte[1024];

    try {
        serverSocket = new DatagramSocket("MY SOCKET PORT");
        InetAddress IP = InetAddress.getByName("MY IP");
        String send= "I am Android";
        sendData = send.getBytes();
        DatagramPacket send = new DatagramPacket(sendData, sendData.length, IP, "MY SEND PORT");
        serverSocket.send(send);

        serverSocket.close();
    } catch (Exception e) {
    }

}
}

收到:

public class ReceiveThread extends Thread {

byte[] receiveData = new byte[1024];
DatagramSocket serverSocket = null;
boolean isActive = true;

public ReceiveThread() {
    this.start();
}

public void run() {

    DatagramSocket serverSocket = null;
    byte[] receiveData = new byte[1024];

    while (isActive) {
        try {
            serverSocket = new DatagramSocket("MY RECEIVE PORT");

            DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);
            serverSocket.receive(receivePacket);
            String sentence = new String( receivePacket.getData());
            System.out.println("RECEIVED: " + sentence);

            serverSocket.close();

        } catch (Exception e){
        }
    }
}

}

出现此问题是因为某些设备锁定了数据报接收器,因为协议安全由工厂实施

您的代码没有错,但是您需要更改多播套接字的DatagramSocket

为此,您需要执行以下步骤:

首先,需要添加使用权限:

<uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE" />
第三,用多播套接字替换DatagramSocket。仅在接收方法上需要输入以下代码或类似代码:

MulticastSocket ms = new MulticastScoket("Your socket port");
ms.joinGroup("Your IP");
发送消息不需要任何修改

我使用的multcast ip等于239.255.255.255。尝试删除多播ip的范围,因为错误的ip将正确阻止方法流

最后,在使用MulticastSocket之前,需要执行
MulticastLock.acquire()
,在使用之后执行
MulticastLock.release()

它可以投入服务,并在启动或停止服务时获取或释放多播锁

MulticastSocket ms = new MulticastScoket("Your socket port");
ms.joinGroup("Your IP");