2013-08-24 17 views
9

Mam skonfigurować mój otwarty ogień (serwer Jabber) na komputerze lokalnym z dwoma użytkownikami testu1 i testuser2. Korzystanie z klienta Spark zarówno użytkownicy wykonują czat bez żadnego problemu, to miło.wysyłanie i odbieranie wiadomości za pomocą smack API

Openfire IP -192.168.1.65

chcę użyć zadatki API (3.3.0) do wysyłania i odbierania wiadomości. Mam kod boczny nadawcy do wysyłania wiadomości (z testuser1) i testowany z komunikatem Spark klienta (z testuser2) odebranym po stronie testuser2, ale kiedy próbuję z kodem java odbierać wiadomość nadawcy, nie mogę odbierać tych wiadomości.

Sender.java

import org.jivesoftware.smack.Chat; 
import org.jivesoftware.smack.XMPPConnection; 
import org.jivesoftware.smack.XMPPException; 
import org.jivesoftware.smack.packet.Message; 
import org.jivesoftware.smack.MessageListener; 

public class Sender 
{ 

    public static void main(String a[]) throws XMPPException, InterruptedException 
    { 
     XMPPConnection connection = new XMPPConnection("192.168.1.65"); 
     System.out.println(connection); 
     connection.connect(); 
     connection.login("testuser1", "test123"); 



     Chat chat = connection.getChatManager().createChat("[email protected]", new MessageListener() { 

      public void processMessage(Chat chat, Message message) { 
       // Print out any messages we get back to standard out. 
       System.out.println("Received message: " + message); 
      } 
     }); 
     chat.sendMessage("Howdy test1!"); 

     while (true) { 
     Thread.sleep(50); 
    } 





    } 

} 

Receiver.java

import org.jivesoftware.smack.Chat; 
import org.jivesoftware.smack.XMPPConnection; 
import org.jivesoftware.smack.XMPPException; 
import org.jivesoftware.smack.packet.Message; 
import org.jivesoftware.smack.MessageListener; 






public class Receiver 
{ 

    public static void main(String a[]) throws XMPPException,, InterruptedException 
    { 
     XMPPConnection connection = new XMPPConnection("192.168.1.65"); 
     System.out.println(connection); 
     connection.connect(); 
     connection.login("testuser2", "test123"); 



     Chat chat = connection.getChatManager().createChat("[email protected]", new MessageListener() { 

      public void processMessage(Chat chat, Message message) { 
       // Print out any messages we get back to standard out. 
       System.out.println("Received message: " + message); 
      } 
     }); 
     chat.sendMessage("Howdy test2!"); 

     while (true) { 
     Thread.sleep(50); 
    } 





    } 

} 

proszę mi pomóc i zaproponować, jeśli jestem po błędne podejście.

Dzięki

Odpowiedz

1

Tworzycie czat i wysyłanie wiadomości czatu z obu stron, ale nie słuchać na pogawędkę z albo. Użyj ChatManagerListener do nasłuchiwania przychodzących rozmów od innych klientów.

16

miałem podobny problem, po wykonaniu tutorial tutaj (http://www.javacodegeeks.com/2010/09/xmpp-im-with-smack-for-java.html) i to co znalazłem:

Podczas tworzenia czat, użytkownik, który chcesz połączyć się rozmawiać (np w moim przypadku " user1 @ gbd038 "). Działa to dobrze, jeśli użytkownik 1 używa klienta GUI, takiego jak Spark (który prawdopodobnie ma wbudowaną obsługę i/lub obsługę błędów), a użytkownik1 otrzyma komunikat. Ten proces dołącza komunikat messageListener do czatu związanego teraz z "user1 @ gbd038". Jednak, gdy odpowiadam od Spark jako user1, czat, który olewa otrzyma faktycznie nadchodzi wraz z tagiem lokalizacji, np:

Received message 'hi' from [email protected]/Spark 2.6.3 

Więc to tworzy nowy czat, że aplikacja nie nasłuchuje na (a zatem twoja aplikacja nie otrzyma/wydrukuje). Znalazłem dwa sposoby rozwiązania tego problemu:

  1. użyć tagu lokalizacja przy rozpoczynaniu rozmowy (chociaż nie wydaje się bardzo skalowalne i solidne):

    xmppManager.sendMessage("Hello mate", "[email protected]/Spark 2.6.3");

  2. jak Robin zasugerowano użycie ChatManagerListener (który utworzy nowy czat po otrzymaniu odpowiedzi od użytkownika 1, który może zostać przekazany do elementu messageListener):

    chatManager = connection.getChatManager(); 
    messageListener = new MyMessageListener(); 
    
    chatManagerListener = new ChatManagerListener() { 
        @Override 
        public void chatCreated(Chat chat, boolean createdLocally) { 
         chat.addMessageListener(messageListener); 
        } 
    }; 
    chatManager.addChatListener(chatManagerListener); 
    

Nadzieję, że pomaga komuś w tej samej pozycji!

+1

Drugie rozwiązanie pracował, dziękuję za świetne rozwiązanie. – Andy

0

skorzystać z poniższego kodu do wysyłania i odbierania wiadomości

@Override 
     public void processMessage(Chat chat, Message message) { 
      // Print out any messages we get back to standard out. 
      System.out.println("Received message: " + message); 
     } 

    }); 

chat.sendMessage("How are you dear !!"); 
System.out.println(" Send Message succesfully"); 

uzyskać pełny kod przykład wizyty How to send message using smack api