2016-07-11 3 views
1

Я пытаюсь установить соединение с сервером xmpp, и это возвращает мне эту ошибку.Android xmpp error host-unknown

W/AbstractXMPPConnection: Соединение закрыто с ошибкой org.jivesoftware.smack.XMPPException $ StreamErrorException: хост-неизвестно Вы можете прочитать больше о значении этого потока ошибки в http://xmpp.org/rfcs/rfc6120.html#streams-error-conditions в org.jivesoftware.smack .tcp.XMPPTCPConnection $ PacketReader.parsePackets (XMPPTCPConnection.java:1003) в org.jivesoftware.smack.tcp.XMPPTCPConnection $ PacketReader.access $ 300 (XMPPTCPConnection.java:944) в org.jivesoftware.smack.tcp.XMPPTCPConnection $ PacketReader $ 1.run (XMPPTCPConnection.java:959) на java.lang.Thread.run (Thread.java:818)

Я попытался использовать этот пример в github и разместил эти данные.

private static final String DOMAIN = "10.20.0.125"; 

private static final String HOST = "10.20.0.125"; 

private static final int PORT = 5222; 

private String userName ="[email protected]"; 

private String passWord = "asdfasdf"; 

Сервер нормально, мы провели еще один тест ПК, чтобы сделать общение на андроид, но эта ошибка не будет устранена.

ответ

0

я вижу в основном 2 ошибки:

в демонстрационной конфигурации у вас есть эти строки кода:

XMPPTCPConnectionConfiguration.Builder configBuilder = XMPPTCPConnectionConfiguration.builder(); 
    configBuilder.setUsernameAndPassword(userName, passWord); 
    configBuilder.setSecurityMode(ConnectionConfiguration.SecurityMode.disabled); 
    configBuilder.setResource("Android"); 
    configBuilder.setServiceName(DOMAIN); 
    configBuilder.setHost(HOST); 
    configBuilder.setPort(PORT); 

Первая проблема (главная): переменная домена должна (но нужно) сервер имя, которое вы можете прочитать в конфигурации сервера, а не только IP; некоторые функции будут нарушены за пределами локального хоста.

Вторая проблема: в то время как я предлагаю разделить систему с конфигурацией (так просто настроить соединение и затем войдите в систему), что я не получаю это имя пользователя: локальный не будут решены вне машины сервера, поэтому снова должно быть заменено именем DOMAIN (даже если теоретически соединение предоставит пользователю его домен, не обязательно должно быть настолько явным).

так:

connection.connect(); 
login(); 

будет заменен

connection.connect(); 
login(userName ,passWord,"Android"); 

и вам нужно удалить эти 2 строки:

configBuilder.setResource("Android"); 
configBuilder.setUsernameAndPassword(userName, passWord); 

о Доменное имя: Вы» вы найдете его в конфигурации сервера, в Openfire это «Имя сервера», которое вы можете прочитать i n веб-интерфейс на странице «Информация о сервере».

+0

Я внесла необходимые изменения, но со следующей ошибкой при выполнении connection.login (LoginUser, passwordUser, RESOURCE_TYPE): login: java.lang.NullPointerException: попытка вызвать метод интерфейса byte [] org.jivesoftware.smack.util.stringencoder.Base64 $ Encoder.encode (byte [], int, int) 'на ссылке нулевого объекта – user6505882

+0

Какова ценность «RESOURCE_TYPE»? Вы зарегистрировали своего пользователя на сервере? Однако я думаю, что это еще один вопрос ... – MrPk

+0

Я не думаю, что требуется новый билет. Потому что эта ошибка возникла при реализации внесенных поправок! Но указан RESOURCE_TYPE (например, «Android»), на всякий случай удаляется, чтобы выполнить новый тест при входе в систему, и проблема сохраняется. – user6505882

0

Мне удалось найти решение. я использовал .jar файлы вместо зависимостей компиляции Gradle:

compile 'org.igniterealtime.smack:smack-android:4.1.4' 
compile 'org.igniterealtime.smack:smack-tcp:4.1.4' 
compile 'org.igniterealtime.smack:smack-im:4.1.4' 
compile 'org.igniterealtime.smack:smack-extensions:4.1.4' 

Таким образом, ошибка устранена. Спасибо за помощь.

Смежные вопросы