gpt4 book ai didi

Android收不到组播包

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:49:01 25 4
gpt4 key购买 nike

我正在研究多播套接字。我编写了一个向 android 客户端发送消息的服务器。到目前为止,客户端应该只记录收到的消息。我注意到我的设备没有收到多播数据包。

这是服务器的代码(在电脑上运行):

public class MulticastServer{

private int port;

private boolean running = false;

private MulticastSocket serverSocket;

private InetAddress group;

private String multicastAddress = "230.192.0.11";

public MulticastServer(int port) {
super();
this.port = port;
init();
}

public MusicStreamerServer() {
this(5500);
}

private void init() {

try {
group = InetAddress.getByName(multicastAddress);
serverSocket = new MulticastSocket(port);
serverSocket.joinGroup(group);
} catch (IOException e) {
e.printStackTrace();
}

}

public void start() throws IOException {
System.out.println("server started");

if (running)
return;

running = true;

new Thread(new Runnable() {

@Override
public void run() {

byte[] buf = new byte[1024];

DatagramPacket packet = new DatagramPacket(buf, buf.length,
group, port);

String msg = "msg";


while (running) {

packet.setData(msg.getBytes(), 0, msg.length());


try {
serverSocket.send(packet);
} catch (IOException e) {
e.printStackTrace();
}
}

}
}).start();

}

public void stop() throws IOException {
running = false;
} }

这是安卓客户端的代码:

public class MainActivity extends Activity {

private MulticastSocket socket;

private InetAddress group;

private String multicastAddress = "230.192.0.11";

private int port = 5500;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

init();
}

private void init() {

StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder()
.permitAll().build();

StrictMode.setThreadPolicy(policy);

try {
group = InetAddress.getByName(multicastAddress);
socket = new MulticastSocket(port);
socket.joinGroup(group);
socket.setBroadcast(true);
} catch (IOException e) {
e.printStackTrace();
Log.wtf("init", e.getMessage());
}

new Thread(new Runnable() {

@Override
public void run() {

WifiManager wm = (WifiManager) getSystemService(Context.WIFI_SERVICE);
WifiManager.MulticastLock multicastLock = wm
.createMulticastLock("mylock");

multicastLock.acquire();

byte[] buf = new byte[1024];

while (true) {

try {
socket.receive(packet);

Log.d("receiver","received = " + (new String(packet.getData())));

} catch (IOException e) {
e.printStackTrace();
}

}

}
}).start();
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main, menu);
return true;
}}

我用 2 种不同的设备测试了代码。 Nexus4 和 Nexus7 (2013) 均运行最新的 Android。

谁能帮帮我?

谢谢

最佳答案

我看到这个问题确实不一致。

安卓版本:4.2.x

在三星 S4 上:多播按预期工作。

在三星 Note 10.1 和 Nexus 4.2.3 上多播未按预期工作。

239.x.x.x 不受支持(遗憾的是它是用于多播电视的那个......)224.0.0.251 按预期工作。

我认为他们的面具有问题。

多播地址通常是|1 1 1 0|多播地址 | 224.0.0.0 - 239.255.255.255

  11100000.00000000.00000000.00000001 = 224.0.0.1
11101111.00000000.00000000.00000001 = 239.0.0.1

所以掩码应该是 224.0.0.0/4 而不是 224.0.0.0/8

关于Android收不到组播包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20921023/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com