2016-06-24 3 views
1

Я разрабатываю приложение Java для общения с устройствами в XMPP.Java Smack 4.1 XMPP может отправлять сообщения, но не может их получать

Учитывая журналы, я могу отправлять сообщения, но я не могу получить их

Вот мой код

XMPPListener.java

package messaging; 

import java.io.IOException; 

import org.jivesoftware.smack.AbstractXMPPConnection; 
import org.jivesoftware.smack.MessageListener; 
import org.jivesoftware.smack.ConnectionConfiguration.SecurityMode; 
import org.jivesoftware.smack.SmackException; 
import org.jivesoftware.smack.SmackException.NotConnectedException; 
import org.jivesoftware.smack.XMPPException; 
import org.jivesoftware.smack.chat.Chat; 
import org.jivesoftware.smack.chat.ChatManager; 
import org.jivesoftware.smack.chat.ChatManagerListener; 
import org.jivesoftware.smack.chat.ChatMessageListener; 
import org.jivesoftware.smack.packet.Message; 
import org.jivesoftware.smack.tcp.XMPPTCPConnection; 
import org.jivesoftware.smack.tcp.XMPPTCPConnectionConfiguration; 

public class XMPPListener implements MessageListener { 

    AbstractXMPPConnection connection; 

    public XMPPListener(String host, int port, String serviceName){ 

     XMPPTCPConnectionConfiguration config = XMPPTCPConnectionConfiguration.builder(). 
       setHost(host) 
       .setServiceName(serviceName) 
       .setSecurityMode(SecurityMode.ifpossible) 
       .setPort(port) 
       .setDebuggerEnabled(true) 
       .build(); 
     this.connection = new XMPPTCPConnection(config); 

    } 

    public void connect() { 
     try { 
      this.connection.connect(); 
     } catch (SmackException | IOException | XMPPException e) { 
      e.printStackTrace(); 
     } 
    } 

    public void login(String userName, String password) throws XMPPException { 
     try { 
      this.connection.login(userName, password); 
     } catch (SmackException | IOException e) { 
      e.printStackTrace(); 
     } 
    } 

    public void sendMessage(String message, String to) throws XMPPException { 
      Chat chat = ChatManager.getInstanceFor(connection).createChat(to); 
      try { 
       chat.sendMessage(message); 
      } catch (NotConnectedException e) { 
       e.printStackTrace(); 
      } 

    } 

    public void listenChat(String name){ 
     ChatManager manager = ChatManager.getInstanceFor(this.connection); 
     manager.addChatListener(new ChatManagerListener() { 

      @Override 
      public void chatCreated(Chat chat, boolean createdLocally) { 
       System.out.println("Created chat"); 
       chat.addMessageListener(new ChatMessageListener() { 

        @Override 
        public void processMessage(Chat chat, Message message) { 
         System.out.println(message.getBody()); 

        } 
       }); 

      } 
     }); 
    } 

    public void disconnect() { 
     connection.disconnect(); 
    } 

    @Override 
    public void processMessage(Message message) { 
     System.out.println("Received something: " + message.getBody()); 


    } 

} 

Main.java

XMPPListener xmppListener = new XMPPListener("ajabber.me",5222,"ajabber.me"); 
     try { 
      xmppListener.connect(); 
      xmppListener.login(user, password); 
      xmppListener.listenChat(to); 
      while(true){ 
      xmppListener.sendMessage("Spack me spack me, Ho !", to); 
      Thread.sleep(10000); 
      } 
     } catch (XMPPException e2) { 
      e2.printStackTrace(); 
     } catch (InterruptedException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

В этом коде я подключаюсь к случайному серверу, который я нашел здесь: list of servers. Тогда я пытаюсь отправить несколько сообщений У меня есть на следующие журналы

11:51:56 AM SENT (0): <stream:stream xmlns='jabber:client' to='ajabber.me' xmlns:stream='http://etherx.jabber.org/streams' version='1.0' xml:lang='en'> 
11:51:56 AM RECV (0): <?xml version='1.0'?><stream:stream xmlns='jabber:client' xmlns:stream='http://etherx.jabber.org/streams' id='11102383658626487319' from='ajabber.me' version='1.0' xml:lang='en'><stream:features><c xmlns='http://jabber.org/protocol/caps' hash='sha-1' node='http://www.process- 
one.net/en/ejabberd/' ver='9BNWaDsRr/HNe8AdlF+JvcDY2L0='/><starttls xmlns='urn:ietf:params:xml:ns:xmpp-tls'><required/></starttls></stream:features> 
11:51:56 AM SENT (0): <starttls xmlns='urn:ietf:params:xml:ns:xmpp-tls'></starttls> 
11:51:56 AM RECV (0): <proceed xmlns='urn:ietf:params:xml:ns:xmpp-tls'/> 
11:51:57 AM SENT (0): <stream:stream xmlns='jabber:client' to='ajabber.me' xmlns:stream='http://etherx.jabber.org/streams' version='1.0' xml:lang='en'> 
11:51:57 AM RECV (0): <?xml version='1.0'?><stream:stream xmlns='jabber:client' xmlns:stream='http://etherx.jabber.org/streams' id='9208753033211689749' from='ajabber.me' version='1.0' xml:lang='en'> 
11:51:57 AM RECV (0): <stream:features><c xmlns='http://jabber.org/protocol/caps' hash='sha-1' node='http://www.process-one.net/en/ejabberd/' ver='9BNWaDsRr/HNe8AdlF+JvcDY2L0='/><register xmlns='http://jabber.org/features/iq-register'/><mechanisms xmlns='urn:ietf:params:xml:ns:xmpp-sasl'><mechanism>PLAIN</mechanism><mechanism>DIGEST-MD5</mechanism><mechanism>X-OAUTH2</mechanism><mechanism>SCRAM-SHA-1</mechanism></mechanisms></stream:features> 
chat created 
11:51:57 AM SENT (0): <message to='[email protected]' id='9ptjB-3' type='chat'><body>coucou</body><thread>d0b9f5a3-515a-4d53-9795-ca112962d4f8</thread></message> 
chat created 
11:51:59 AM SENT (0): <message to='[email protected]' id='9ptjB-4' type='chat'><body>coucou</body><thread>a6dbc7a0-2b3a-4a30-9be6-2b1e2995cadb</thread></message> 

Учитывая эти журналы, я предполагаю, что сообщения отправляются и чат также создан, но, кажется, что я никогда не получать сообщения. Могли бы вы, ребята, помочь мне решить эту проблему?

Я бегу Java 1.8 и Smack 4,7

EDIT

Я попытался с помощью Спарк: мне удалось поговорить с моим приложением (в клиенте Спарк), я также редактировал свой код как новая версия

Вот доказательство с прекрасным скриншоте

SparkClient

Однако я до сих пор не могу получить мои сообщения: Я вижу их в журналах, но этот метод в чате слушателя не называется

ЖУРНАЛОВ

03:17:22 PM RECV (0): <message from='[email protected]/Spark' to='[email protected]/Smack' id='NdNHr-150' type='chat'><body>Wololo</body><thread>5292f083-bba9-4a63-ab40-9718b5e00bd0</thread><x xmlns='jabber:x:event'><offline/><composing/></x></message> 

ПОСЛЕДНИЙ EDIT

Мои код работает с вышеуказанным, особое спасибо MrKp

ответ

1

Допущения:

  • Сервер существует (почему не установить LocalMachine Openfire или Whatelse?)
  • Пользователь «Отправитель» правильно зарегистрированным на этом сервере
  • пользователя «приемник» правильно зарегистрирован на сервере
  • Вы управляете с 2 клиентами «отправитель» пользователя и пользовательский «приемник» (почему бы не установить его как второго клиента Spark?), или, альтернативно, «ресивер» - это рабочий бот в режиме эха.

Вы не сможете получать свои исходящие сообщения в чате, но вы будете делать в группах. В чатах вы сможете установить прослушиватель для сообщений «reciver».

О коде и как исправить:

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

Правильный порядок:

  1. подключить
  2. Войти
  3. новый чат
  4. ChatManager.getInstance (соединение) .addChatListener

теперь вы будете иметь возможность прослушивать входящие сообщения в этом чате, когда «ресивер» отправит вам один

+1

Спасибо за ответ! Я попробую ваше решение, и я держу вас в курсе. –

+0

Я последовал за вами советами, я знаю, что использовать Spark как приемник (и режим эха). Мне удается заставить мое программное обеспечение разговаривать со мной в моей Спарке, я могу поговорить с ним. Но когда я разговариваю с ним, вместо того, чтобы отображать то, что я ввел в метод processMessage, я получаю только журналы: ** 03: 07: 58 PM RECV (0): <сообщение from='[email protected]/Spark ' to='[email protected]/Smack 'id =' NdNHr-87 'type =' chat '> wololo 5292f083-bba9-4a63-ab40-9718b5e00bd0 ** –

+0

Хорошо, я нашел решение, большое спасибо за вашу помощь MrPk, наслаждайтесь продажами Steam;) –

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