某些设备无法接收Android UDP

时间:2015-04-13 13:38:40

标签: java android multithreading udp send

我有一个UDP发送和接收,可以在我的设备Samsung Galaxy Ace Plus(S7500)中使用,但相同的代码在其他设备中不起作用,例如Samsung 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){
        }
    }
}

}

1 个答案:

答案 0 :(得分:0)

这个问题出现了,因为有些设备会锁定数据报接收器,因为工厂实现了协议安全性。

您的代码没有错,但您需要更改MulticamsSocket的DatagramSocket。

为此你需要执行一些步骤:

首先,需要添加uses-permission:

<uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE" />

在AmdroidManifest.xml上

其次,有必要创建MulticastLock;如果没有这个,MulticastSocket就无法正常工作;

WifiManager wifi = (WifiManager) getSystemService(Context.WIFI_SERVICE);
multicastLock = wifi.createMulticastLock("multicastLock");
multicastLock.setReferenceCounted(true);

第三,用MulticastSocket替换DatagramSocket。只有在接收方法时才需要将代码放在下面或类似代码中:

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

不需要任何修改来发送消息。

我使用的是multcast ip equals到239.255.255.255。尝试使用多播ip的范围,因为错误的ip将正确阻止方法流。

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

它可能会在服务上受到影响,并在启动或停止服务时获取或释放MulticastLock。