我正在玩一点多播套接字。我编写了一个向 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;
} }
下面是android客户端的代码:
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;
}}
我已经用两种不同的设备测试了代码。 Nexus 4 和 Nexus 7 (2013) 均运行最新的 Android。
有人可以帮助我吗?
Thanks
我发现这个问题确实很矛盾。
安卓版本:4.2.x
在三星 S4 上处于活动状态:
多播正在按预期工作。
在 Samsung 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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)