Я пытаюсь создать простую многоадресную связь между моим ПК (Ubuntu, клиент) и моим телефоном (Android, сервер).
Соединения Unicast/TCP работают без проблем, определенный порт (37659) открывается как на ПК, так и на телефоне. При попытке использовать MulticastSocket порты не открываются. nmap сообщает мне, что указанный порт (36963) является портом TCP и что он закрыт. (Пока выполняется receive
-метод).
Я делаю что-то неправильно? Или брандмауэр блокирует многоадресные сокеты? (Я пробовал около 20 разных портов, и ни один из них не работал... в настоящее время используется порт 36963)
EDIT: Также, когда брандмауэр полностью отключен, nmap сообщает мне, что порт закрыт...
Код сервера (телефон):
private void multicastLoop() {
String res = Build.FINGERPRINT + "\n";
final InetAddress group;
final MulticastSocket socket;
final DatagramPacket response;
try {
group = InetAddress.getByName("224.0.0.115");
socket = new MulticastSocket(mport);
socket.setLoopbackMode(true);
socket.setSoTimeout(10000);
socket.joinGroup(group);
response = new DatagramPacket(res.getBytes(), res.length(), group, mport);
} catch (IOException e) {
e.printStackTrace();
return;
}
Thread t = new Thread(new Runnable() {
@Override
public void run() {
while(isRunning) {
try {
byte[] data = new byte[1024];
DatagramPacket dm = new DatagramPacket(data, data.length);
socket.receive(dm);
Log.d("udp", "received");
if (Arrays.equals(dm.getData(), "someone there".getBytes())) {
socket.send(response);
}
} catch (SocketTimeoutException e) {
continue;
} catch (IOException e) {
e.printStackTrace();
}
}
try {
socket.leaveGroup(group);
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
});
t.start();
}
Код клиента (компьютер):
public String[] findServers() {
String hello = "someone there";
try {
InetAddress group = InetAddress.getByName(mhost);
MulticastSocket socket = new MulticastSocket(mport);
socket.setLoopbackMode(true);
socket.setSoTimeout(60000);
socket.joinGroup(group);
DatagramPacket p = new DatagramPacket(hello.getBytes(), hello.length(), group, mport);
byte[] buffer = new byte[1024];
socket.send(p);
DatagramPacket r = new DatagramPacket(buffer, buffer.length);
socket.receive(r);
socket.leaveGroup(group);
socket.close();
String srinfo = "";
byte[] data = r.getData();
for (byte b: data)
srinfo += (char) b;
System.out.println("Server found at " + r.getAddress().getHostName() + ": " + srinfo);
} catch (SocketTimeoutException e) {
return new String[] {"timeout"};
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
.setTimeToLive()
вместо.setTimeout()
? Я не уверен, однако. - person Siva Tumma   schedule 26.01.2014setTimeToLive()
? - person s3lph   schedule 26.01.2014