我有一个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){
}
}
}
}
答案 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。