我有一个可以在我的设备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。