2013-08-24 78 views
9

我已經在本地機器上用兩個用戶testuser1和testuser2設置了我的明火(jabber服務器),兩個用戶都使用Spark客戶端進行聊天,沒有任何問題,這很好。使用smack發送和接收消息API

Openfire的IP -192.168.1.65

我想用咂嘴API(3.3.0),用於發送和接收消息。我已經寫了發送端代碼發送消息(與testuser1),並測試與testuser2端收到消息的客戶端(與testuser2)消息,但是當我嘗試使用Java代碼接收發件人消息,我無法接收這些發佈消息。

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); 
    } 





    } 

} 

請幫助我,並建議如果我下面錯誤的做法。

感謝

回答

1

您正在創建一個聊天,並從兩端發送聊天消息,但沒有監聽,無論是從聊天。使用ChatManagerListener偵聽來自其他客戶端的傳入聊天。

16

我也有類似的問題,在這裏(http://www.javacodegeeks.com/2010/09/xmpp-im-with-smack-for-java.html)以下的教程後,這是我發現:

當您創建聊天,你聊天你要連接到用戶(例如,在我的情況「 USER1 @ gbd038" )。如果user1使用的是一個GUI客戶端,例如Spark(它可能具有內置的支持和/或錯誤處理功能),並且user1將收到該消息,則此功能正常工作。此過程將messageListener附加到與「user1 @ gbd038」關聯的聊天中。然而,當我從星火回覆爲用戶1,即嫌接收聊天實際上是通過完整的未來與位置標籤,如:

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

所以它會創建一個新的聊天應用程序沒有偵聽(因此您的應用程序將不會收到/打印出來)。我發現兩種方法來解決這個問題:

  1. 使用位置標記後,開始通話時(雖然這似乎不是很可擴展性或穩健):

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

  2. 羅賓建議使用ChatManagerListener(當接收到user1的回覆時可以創建一個新的聊天,它可以轉發給messageListener):

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

希望能幫助有人在同一個位置!

+1

解決方法二工作了,非常感謝偉大的解決方案。 – Andy

0

使用下面的代碼來發送和接收消息

@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"); 

對於完整的代碼示例訪問How to send message using smack api