2016-08-03 2 views
2

У меня возникли проблемы с отправкой/получением сообщений с помощью Smack и Openfire. В настоящее время моя установка включает в себя два компьютера. На обоих компьютерах работает эмулятор Android, который запускает программу. Сначала программа запускает активность входа в систему, а затем запускает активность интерфейса чата. Интерфейс чата в настоящее время ничего не делает; после запуска функции ChatInterface сообщение автоматически отправляется.Проблемы с отправкой/получением сообщений с помощью Smack и Openfire

Один компьютер (ноутбук) работает как сервер, а настольный компьютер подключается к серверу ноутбуков (Openfire). Глядя на резюме пользователя Openfire на ноутбуке, оба пользователя, похоже, доступны и готовы к разговору. Однако, когда его время для приема сообщений, ничего не появляется. Сообщения не печатаются на объекте вида, таком как ListView, но в журнале.

Ниже приведен код для ноутбука:

private static final String TAG = "MSG"; 

private ListView screen; 
private EditText textEditor; 
private Button sendButton;  

private final String Host = "10.0.2.2"; 
private final int port = 5222; 

private AbstractXMPPConnection connection; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_chat_interface); 

    screen = (ListView) findViewById(R.id.ScreenView); 
    textEditor = (EditText) findViewById(R.id.TextEditBox); 
    sendButton = (Button) findViewById(R.id.SendButton); 

    Log.d(TAG, "onCreate Chat Interface"); 

    final String username = getIntent().getExtras().getString("Username"); 
    final String password = getIntent().getExtras().getString("Password"); 

    new AsyncConnect().execute(username, password); 

    sendButton.setOnClickListener(new View.OnClickListener(){ 
     public void onClick(View v) { 
     } 
    }); 

    Log.d(TAG, "Success"); 

} 

public class AsyncConnect extends AsyncTask<String, Void, Void> 
{ 
    ProgressDialog pdLoading = new ProgressDialog(ChatInterface.this); 

    protected void onPreExecute() 
    { 
     pdLoading.setMessage("Loading..."); 
     pdLoading.show(); 
    } 

    protected Void doInBackground(String...params) 
    { 
     XMPPTCPConnectionConfiguration.Builder configBuilder = XMPPTCPConnectionConfiguration.builder(); 
     configBuilder.setUsernameAndPassword(params[0], params[1]); 
     configBuilder.setServiceName("Openfire"); 
     configBuilder.setHost(Host); 
     configBuilder.setPort(port); 
     configBuilder.build(); 

     configBuilder.setSecurityMode(ConnectionConfiguration.SecurityMode.disabled); // Remove this later could be security threat 
     connection = new XMPPTCPConnection(configBuilder.build()); 

     try { 

      connection.connect(); 
      connection.login(); 
      Log.d(TAG, "Logged on"); 
      Log.d(TAG, "Connection: " + connection.getUser()); 


      if(params[0].equals("test2") && params[1].equals("test2!")) { 
       Log.d(TAG, "Entered test2"); 




       ChatManager chatManager = ChatManager.getInstanceFor(connection); 
       Log.d(TAG, "ChatManager"); 

       Chat newChat = chatManager.createChat("[email protected]", new ChatMessageListener(){ 

        public void processMessage(Chat chat, Message message) 
        { 
         Log.d(TAG, "Received Message From Desktop: " + message.getBody()); 

        } 

       }); 

       newChat.sendMessage("This is Jane Doe"); 
       chatManager.addChatListener(
         new ChatManagerListener() { 

          @Override 
          public void chatCreated(Chat chat, boolean createdLocally) { 

           Log.d(TAG, "Entered chatCreated"); 

           if (!createdLocally) { 

            Log.d(TAG, "Entered Locally"); 
            chat.addMessageListener(new ChatMessageListener() { 
             @Override 
             public void processMessage(Chat chat, Message message) { 

              try { 
               Log.d(TAG, "Incoming message..."); 
               Log.d(TAG, "Received message from Desktop: " + message.getBody()); 
               Log.d(TAG, "Message Received"); 

              } catch (Exception e) { 
               e.printStackTrace(); 
              } 


             } 
            }); 

           } 
          } 
         }); 

       Log.d(TAG, "Listened"); 
      } 



     } 
     catch(SmackException.ConnectionException e) 
     { 
      e.printStackTrace(); 
      Log.d(TAG, "SmackException.ConnectionException"); 
     } 
     catch(XMPPException e) 
     { 
      e.printStackTrace(); 
      Log.d(TAG, "XMPPException"); 
     } 
     catch(IOException e) 
     { 
      e.printStackTrace(); 
      Log.d(TAG, "IOException"); 
     } 
     catch(SmackException e) 
     { 
      e.printStackTrace(); 
      Log.d(TAG, "SmackException"); 
     } 
     return null; 
    } 

    protected void onPostExecute(Void params) 
    { 
     pdLoading.dismiss(); 
    } 
} 

Ниже приведен код рабочего стола:

private static final String TAG = "MSG"; 

private ListView screen; 
private EditText textEditor; 
private Button sendButton; 


private final String Host = "192.168.1.152"; 
private final int port = 5222; 

private AbstractXMPPConnection connection; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_chat_interface); 

    screen = (ListView) findViewById(R.id.ScreenView); 
    textEditor = (EditText) findViewById(R.id.TextEditBox); 
    sendButton = (Button) findViewById(R.id.SendButton); 

    Log.d(TAG, "onCreate Chat Interface"); 

    final String username = getIntent().getExtras().getString("Username"); 
    final String password = getIntent().getExtras().getString("Password"); 

    sendButton.setOnClickListener(new View.OnClickListener(){ 
     public void onClick(View v){ 
     } 
    }); 

    new AsyncConnect().execute(username, password); 
    Log.d(TAG, "Success"); 
} 

public class AsyncConnect extends AsyncTask<String, Void, Void> { 
    ProgressDialog pdLoading = new ProgressDialog(ChatInterface.this); 

    protected void onPreExecute() { 
     pdLoading.setMessage("Loading..."); 
     pdLoading.show(); 
    } 

    protected Void doInBackground(String...params) { 
     XMPPTCPConnectionConfiguration.Builder configBuilder = XMPPTCPConnectionConfiguration.builder(); 
     configBuilder.setUsernameAndPassword(params[0], params[1]); 
     configBuilder.setServiceName("Openfire"); 
     configBuilder.setHost(Host); 
     configBuilder.setPort(port); 
     configBuilder.build(); 

     configBuilder.setSecurityMode(ConnectionConfiguration.SecurityMode.disabled); // Remove this later could be security threat 
     connection = new XMPPTCPConnection(configBuilder.build()); 

     try { 

      connection.connect(); 
      connection.login(); 
      Log.d(TAG, "Logged on"); 
      Log.d(TAG, "Connection: " + connection.getUser()); 
      if(params[0].equals("test1") && params[1].equals("test1!")) 
      { 
       Log.d(TAG, "Entered test1"); 
       ChatManager chatmanager = ChatManager.getInstanceFor(connection); 
       Log.d(TAG, "ChatManager"); 
       Chat newChat = chatmanager.createChat("[email protected]", new ChatMessageListener() { 

        @Override 
        public void processMessage(Chat chat, Message message) { 

         Log.d(TAG, message.getBody()); 
        } 
       }); 

       newChat.sendMessage("This is John Doe"); 
       Log.d(TAG, newChat.getParticipant()); 
       Log.d(TAG, "Message sent"); 
      } 

     } 
     catch(SmackException.ConnectionException e) 
     { 
      e.printStackTrace(); 
      Log.d(TAG, "SmackException.ConnectionException"); 
     } 
     catch(XMPPException e) 
     { 
      e.printStackTrace(); 
      Log.d(TAG, "XMPPException"); 
     } 
     catch(IOException e) 
     { 
      e.printStackTrace(); 
      Log.d(TAG, "IOException"); 
     } 
     catch(SmackException e) 
     { 
      e.printStackTrace(); 
      Log.d(TAG, "SmackException"); 
     } 
     return null; 
    } 

    protected void onPostExecute(Void params) 
    { 
     pdLoading.dismiss(); 
    } 
} 

методы Ни processMessages в настоящее время называют ничего не печатается в LogCat.

Я не совсем уверен, в чем проблема. Некоторые из документации Smack, похоже, устарели, и нет большого количества полезных ресурсов для API. Кто-нибудь знает, что может быть проблемой?

ответ

1

Я вижу много проблем, предлагаю лучше ознакомиться с документацией.

То, что я узнал:

XMPPTCPConnectionConfiguration.Builder configBuilder = XMPPTCPConnectionConfiguration.builder(); 
     configBuilder.setUsernameAndPassword(params[0], params[1]); 
     configBuilder.setServiceName("Openfire"); 
     configBuilder.setHost(Host); 
     configBuilder.setPort(port); 
     configBuilder.build(); 

ServiceName это имя сервера, по умолчанию это машина имя, где он установлен Openfire. У вас возникнут проблемы, если у вас нет конкретной конфигурации для назначения этого имени. Проверьте правильное имя на панели управления администратора (журнал Openfire скажет, где он слушает ... что-то вроде yourmachinename:9090)

Гораздо лучше разделить функциональность подключения от функций входа. Я предлагаю удалить setUsernameAndPassword и использовать params[0] и params[1] в вызове connection.login(). Вы пропустите ресурс (это строка, как «Спарк», «Смак», «Android», «MyXmppClient») и есть некоторые конфигурации и проблемы, по умолчанию, если вы пропустите его.

поэтому я предлагаю изменить, например, с этим:

connection.login(param[0],param[1],"MyAndroidApp"); 

имя пользователя должно быть в нижнем регистре, Openfire имеет некоторые оборонительное toLowerCase() в своем коде, но это лучше избегать заглавных букв. Поэтому не забудьте использовать JID в нижнем регистре.

[email protected] должен быть: [email protected]

Howerver, это не об электронной: вам нужен JID, так что это не «Yahoo.ком», но @yourservername (тот же вопрос SERVICENAME я говорил раньше).

Вы пытаетесь создать чат с„LoveJack“на XmppServer под названием„yahoo.com“, я не думаю, что это ваша цель.

возможно, вы не правильно зарегистрировать пользователей, которые вы используете на сервере, попытайтесь проверить (если говорить на Yahoo, это то, что вы хотите, может быть, вы должны что-то like this прочитать)

+0

Ого, спасибо за очищая много вещей Что такое ресурс? Предполагается ли он быть каким-то идентификатором? – Czar

+0

Это идентификатор клиента (скажем, как «Skype»), но если вы его не установили, это значение по умолчанию; необходимо доставить meggages на правильное устройство (usecase: вы подключены как со смартфоном, так и планшетом), но значение по умолчанию может ввести в заблуждение сервер xmpp. Если это поможет, не забудьте принять ответ;) – MrPk

+0

Большое спасибо за информативный пост. – Czar

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