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


}

最佳答案

发生此问题的原因是某些设备锁定了数据报接收器,因为工厂实现了协议安全性。

您的代码没有错,但是您需要将DatagramSocket更改为MulticastSocket。

为此,您需要执行一些步骤:

首先,需要添加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");


无需任何修改即可发送消息。

我使用的多播IP等于239.255.255.255。尝试设置多播ip的范围,因为错误的ip会正确阻止方法流。

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

它可以投入使用,并在启动或停止服务时获取或释放MulticastLock。

09-11 17:30