DatagramSocket.bind (); Исключение сокета: невозможно назначить запрошенный адрес. Эмулятор Android - PullRequest
4 голосов
/ 02 марта 2011

Я новичок в Android и Java, поэтому прошу прощения, если мой вопрос спрашивается в неподходящей группе или на форуме. Я сделал .Net приложение для моей компании, и недавно они попросили меня перенести его на Android, чтобы установить его на Samsung Galaxy Tabs.

Прежде всего, я использую Eclipse, JDK 6, целевую платформу Android 2.2 и эмулятор с плагином GalaxyTab. Моя операционная система Windows 7.

Это приложение отправляет и получает сообщения от определенного Контроллер в сети с использованием UDP. Короче говоря, мое приложение использует DatagramSocket, привязывает его к локальному «InetSocketAddress», а затем запускает поток, который прослушивает датаграммы, в то время как другой поток отправляет запросы контроллеру по запрос пользователя. Вот фрагмент кода:

Здесь я назначаю локальный адрес и сокет:

try {
     loc_addr = new InetSocketAddress(
       Inet4Address.getByAddress(
              new byte[]{(byte) 192,(byte) 168,1,(byte)240}), 0xBAC0); 
       //192.168.1.240 is the IP of my machine on the network
} catch (UnknownHostException e) {
     .......
}
try {
     soc = new DatagramSocket();
     soc.setReuseAddress(true);
     soc.setBroadcast(true);
     soc.bind(loc_addr);
} catch (SocketException e) {
     .......
}

Здесь я слушаю входящие дейтаграммы:

try{
     buf = new byte[1024];
     receive_pac = new DatagramPacket(buf, 1024);
     soc.receive(receive_pac);
     if (receive_pac.getData() != null){
     .......
     }
}

Здесь я отправляю данные:

try {
    addr = (Inet4Address) Inet4Address.getByAddress (new byte[]
{(byte) 192,(byte) 168,1,(byte) 255}); //The message I am sending should be broadcasted
} catch (UnknownHostException e) {
    ......
}
sendPacket = new DatagramPacket(buf, buf.length, addr,
loc_addr.getPort());
try {
    soc.send(sendPacket);
} catch (IOException e) {
    ......
}

Хорошо, когда я использую "soc.bind (...)", я получаю следующее исключение: не может назначить запрошенный адрес

Затем я получаю отладочное сообщение (я не знаю, уместно ли оно):

DEBUG/SntpClient(58): request time failed: java.net.SocketException: Address family not supported by protocol

Приложение работает, я проверил через "WireShark", что когда я попросить эмулятор отправить данные на контроллер, контроллер отвечает обратно с ожидаемыми данными правильно. Тем не менее сокет, в приложении, на эмуляторе ничего не получает и остается заблокированным на звонок "Получить"!

Может ли кто-нибудь помочь мне выяснить, какую проблему или ошибку я совершил с получением части моего приложения!

Любая помощь очень ценится,

Ответы [ 2 ]

8 голосов
/ 18 марта 2011

TMI,

* 1002.

В отношении этого:

Я попытался привязать его к сокету, и это привело к «SocketException: Invalid Argument». Тем не менее программа доставила ту же операцию! Ты хоть представляешь, что может означать это исключение?

Возможно, вы уже решили это, но у меня был тот же вопрос и я ответил на него сам здесь .

Что избавило меня от этого исключения, так это изменило способ создания DatagramSocket.

С:

sock = new DatagramSocket();

Кому:

DatagramChannel channel = DatagramChannel.open();
DatagramSocket socket = channel.socket();
0 голосов
/ 02 марта 2011

Обычно вы видите это сообщение об ошибке, если пытаетесь привязать IP-адрес, который вам не принадлежит.Вы уверены, что IP-адрес вашего эмулятора Android - 192.168.1.240?IP-адрес эмулятора может отличаться от IP-адреса вашего хост-компьютера.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...