Модераторы: javastic
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Поиск сервера, среди в сети с телефона 
V
    Опции темы
OXOTHUK
Дата 22.9.2011, 14:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 116
Регистрация: 21.9.2005

Репутация: нет
Всего: 6



Здравствуйте,
Пишется клиент-серверное приложение, создается сервер на одном телефоне, клиент подключается с другого телефона, оба, соответственно на андроиде и подключены в одну локальную сеть через wifi-роутер или wifi-точку доступа одного из телефонов. 
Необходимо выполнить поиск работающих серверов шикоровещательным запросом, т.е. подключить к серверу без знания ip-адреса. Погуглил, нашел MulticastSocket.
Код
private static final int MulticastingPort = 34343;
private static final String MulticastingGroup = "224.0.0.122";

...

MulticastSocket _server = new MulticastSocket(MulticastingPort);
InetAddress _group = InetAddress.getByName(MulticastingGroup);
_server.joinGroup(_group);

Вылетает на joinGroup с ошибкой Socket exception: no such device
Пробовал разные ip class D, но безрезультатно.

Как решить данную проблему или реализовать эту функциональность другим способом?
PM MAIL   Вверх
ivanovpv
Дата 23.9.2011, 13:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Варвар
**


Профиль
Группа: Участник
Сообщений: 639
Регистрация: 26.1.2005
Где: Москва

Репутация: 9
Всего: 28



Если вылетает значит не стоит пермишен в манифесте - что-то вроде такого

но это еще не все, по умолчанию ось будет фильтровать мультикаст запросы - их надо разблокировать, примерно так:
Код

MulticastLock multicastLock = new MulticastLock();     
multicastLock.acquire(); 



--------------------
Aut viam inveniam aut faciam
PM MAIL Skype   Вверх
OXOTHUK
Дата 25.9.2011, 20:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 116
Регистрация: 21.9.2005

Репутация: нет
Всего: 6



Да, спасибо, вроде помогло, но почему-то не до конца.
У меня 2 устройства: desire и galaxy tab.
Если создать сервер на планшете, то норм, мобилка находит сервер, посылает пакет, тот отвечает обычным сокетом.
А если наоборот, т.е. сервер на мобилке, а планшетник посылает датаграмму - нет, не приходит пакета.
Странно, код один и тот же.

Может я все таки где-то скосячил?

Подсоединены к одному роутеру.
Манифест:
Код
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>

И сервер, и клиент перед манипуляциями с сокетами выполняют это:
Код
WifiManager wifi = (WifiManager)getSystemService( Context.WIFI_SERVICE );
if(wifi != null)
{
    _mcLock = wifi.createMulticastLock("mylock");
    _mcLock.acquire();
}
...
@Override
protected void onStop()
{
    super.onStop();
    if (_mcLock != null && _mcLock.isHeld())
        _mcLock.release();
    if (_multicast != null)
        _multicast.cancel();
}

Может я тут где-то не прав?

На всякий, клиент:
Скрытый текст

Код
private static final int MulticastPort = 5002;
private static final String MulticastAddress = "224.0.0.112";
...
_connection = new MulticastSocket();
byte[] datagramBuffer = new byte[256];
DatagramPacket packet = new DatagramPacket(datagramBuffer, datagramBuffer.length, InetAddress.getByName(MulticastAddress), MulticastPort);
_connection.send(packet);

сервер:
Код
private static final int MulticastPort = 5002;
private static final String MulticastListenAddress = "224.0.0.112";
...
_server = new MulticastSocket(MulticastPort);
InetAddress group = InetAddress.getByName(MulticastListenAddress);
_server.joinGroup(group);
byte[] datagramBuffer = new byte[256];
DatagramPacket packet = new DatagramPacket(datagramBuffer, datagramBuffer.length);
_server.receive(packet);


PM MAIL   Вверх
ivanovpv
Дата 26.9.2011, 19:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Варвар
**


Профиль
Группа: Участник
Сообщений: 639
Регистрация: 26.1.2005
Где: Москва

Репутация: 9
Всего: 28



Проверь версии Андроида на обоих аппаратах и под какую SDK ты собираешь? Подозреваю что у Desire 2.2, а у TAB 3.0 - на всякий случай собери все под 2.2 или 3.0 (с флагом minSDK=4) - попробуй разные комбинации - иногда помогает. 

Изучи логи!  smile   


--------------------
Aut viam inveniam aut faciam
PM MAIL Skype   Вверх
OXOTHUK
Дата 27.9.2011, 15:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 116
Регистрация: 21.9.2005

Репутация: нет
Всего: 6



Цитата(ivanovpv @  26.9.2011,  19:38 Найти цитируемый пост)
Изучи логи! 

при вызове
Код
_mcLock = wifi.createMulticastLock("mylock");
_mcLock.acquire();

в логах прописывается:
Код
09-27 16:32:47.817: INFO/wpa_supplicant(13782): Rx Data Filter Remove [4] command
09-27 16:32:47.817: INFO/wpa_supplicant(13782): Rx Data Filter: do not support, ignore
09-27 16:32:47.817: INFO/wpa_supplicant(13782): Rx Data Filter Remove [3] command
09-27 16:32:47.817: INFO/wpa_supplicant(13782): Rx Data Filter: do not support, ignore
09-27 16:32:47.817: INFO/wpa_supplicant(13782): Rx Data Filter Remove [0] command
09-27 16:32:47.817: INFO/wpa_supplicant(13782): Rx Data Filter: do not support, ignore


На обоих аппаратах 2.2 стоит, компилится под 2.2, minSDKVersion=8, хотя и при 4 ничего не изменилось.

Это сообщение отредактировал(а) OXOTHUK - 27.9.2011, 15:42
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Android | Следующая тема »


 




[ Время генерации скрипта: 0.0989 ]   [ Использовано запросов: 20 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.