2016-02-20 116 views
0

我讀了很多關於如何通過打開4.1 和openFire發送和接收消息的相關帖子。從我的理解我執行以下代碼XMPP Smack無法收到消息

我可以連接,我可以登錄。但是當發送消息表格user1到user2我什麼也沒得到。

代碼:

package passargad.ehsan; 

import android.app.Service; 
import android.content.Intent; 
import android.os.AsyncTask; 
import android.os.IBinder; 
import android.util.Log; 
import org.jivesoftware.smack.ConnectionConfiguration; 
import org.jivesoftware.smack.ConnectionListener; 
import org.jivesoftware.smack.SmackException; 
import org.jivesoftware.smack.XMPPConnection; 
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; 
import java.io.IOException; 

public class XMPPservice extends Service { 
    XMPPTCPConnection connection;  
    String connectionMessages=""; 
    ConnectionXMPP connectionXMPPAsynch =new ConnectionXMPP(); 

    @Override 
    public void onCreate() 
    { 
     super.onCreate(); 
    } 

    @Override 
    public int onStartCommand(Intent intent, int flags, int startId) { 
     try { 
      connectionXMPPAsynch.execute(); 
     } 
     catch (Exception e) 
     { 
     } 
     return super.onStartCommand(intent, flags, startId); 

    } 
    @Override 
    public void onDestroy() { 
     super.onDestroy(); 


    } 
    @Override 
    public IBinder onBind(Intent intent) { 
     // TODO: Return the communication channel to the service. 
     throw new UnsupportedOperationException("Not yet implemented"); 
    } 

    class ConnectionXMPP extends AsyncTask<String,Void,String> 
    { 

     @Override 
     protected String doInBackground(String... params) { 
      connection = new XMPPTCPConnection(XMPPTCPConnectionConfiguration.builder() 
        .setServiceName("192.168.1.6").setUsernameAndPassword("ehsan", "123") 
        .setPort(9090).setSecurityMode(ConnectionConfiguration.SecurityMode.disabled) 
        .setCompressionEnabled(false).build()); 
      connection.setUseStreamManagement(true); 
      connection.addConnectionListener(new ConnectionListener() { 

       @Override 
       public void connected(XMPPConnection connection) { 
        Log.d("connected", "yes connected successfully : "); 

       } 

       @Override 
       public void authenticated(XMPPConnection connection, boolean resumed) { 
        Log.d("connected","yes authenticated successfully : "); 
       } 

       @Override 
       public void connectionClosed() { 
        Log.d("connected","yes connectionClosed successfully : "); 
       } 

       @Override 
       public void connectionClosedOnError(Exception e) { 

        Log.d("connected","yes connectionClosedOnError : "); 
        connectionMessages="connectionClosedOnError"; 
        publishProgress(); 

       } 

       @Override 
       public void reconnectionSuccessful() { 
        Log.d("connected","yes reconnection successfully : "); 
       } 

       @Override 
       public void reconnectingIn(int seconds) { 
        Log.d("connected","yes reconnectingIn : "); 
       } 

       @Override 
       public void reconnectionFailed(Exception e) { 
        Log.d("connected","yes reconnectionFailed : "); 
       } 
      }); 

      connect(); 
      chat(); 





      return null; 
     } 



     @Override 
     protected void onProgressUpdate(Void... values) { 
      super.onProgressUpdate(values); 
      if (connectionMessages=="connectionClosedOnError") 
      {  
       connect();  
      }  
     } 

     @Override 
     protected void onPostExecute(String s) { 
      super.onPostExecute(s); 
      Log.d("","onPostExecute"); 
     } 

     private void connect() 
     { 

      try { 
       connection.connect(); 
       connection.login(); 
       Log.d(""," user id :: " + connection.getUser()); 

      } catch (SmackException e) { 
       e.printStackTrace(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } catch (XMPPException e) { 
       e.printStackTrace(); 
      } 


     } 
     private void chat() 
     { 

      ChatManager chatmanager = ChatManager.getInstanceFor(connection); 
      Chat newChat = chatmanager.createChat("192.168.1.6" ,new ChatMessageListener() { 
       @Override 
       public void processMessage(Chat chat, Message message) { 

        Log.d("","message :"+ message.getBody()); 
       } 
      }); 
      try 
      { 

       Message newMessage = new Message(); 
       newMessage.setBody("Howdy!"); 
       newMessage.setFrom("[email protected]/Smack"); 
       newMessage.setTo("[email protected]/Smack"); 
       newChat.sendMessage(newMessage); 



      } 
      catch (SmackException.NotConnectedException e) 
      { 
       e.printStackTrace(); 
      } 

      chatmanager.addChatListener(
        new ChatManagerListener() { 
         @Override 
         public void chatCreated(Chat chat, boolean createdLocally) 
         { 
          if (!createdLocally) 
           chat.addMessageListener(new ChatMessageListener() { 
            @Override 
            public void processMessage(Chat chat, Message message) { 
             Log.d("","message :"+ message.getBody()); 
            } 
           });; 
         } 
        }); 

     } 

    } 

} 

這裏是logcat的:

02-20 06:45:13.334 1188-1188/passargad.ehsan I/dalvikvm﹕ Could not find method android.view.ViewGroup.onInitializeAccessibilityEvent, referenced from method android.support.v7.widget.LinearLayoutCompat.onInitializeAccessibilityEvent 
02-20 06:45:13.334 1188-1188/passargad.ehsan W/dalvikvm﹕ VFY: unable to resolve virtual method 13351: Landroid/view/ViewGroup;.onInitializeAccessibilityEvent (Landroid/view/accessibility/AccessibilityEvent;)V 
02-20 06:45:13.334 1188-1188/passargad.ehsan D/dalvikvm﹕ VFY: replacing opcode 0x6f at 0x0006 
02-20 06:45:13.334 1188-1188/passargad.ehsan D/dalvikvm﹕ VFY: dead code 0x0009-0011 in Landroid/support/v7/widget/LinearLayoutCompat;.onInitializeAccessibilityEvent (Landroid/view/accessibility/AccessibilityEvent;)V 
02-20 06:45:13.344 1188-1188/passargad.ehsan W/dalvikvm﹕ VFY: unable to find class referenced in signature (Landroid/view/accessibility/AccessibilityNodeInfo;) 
02-20 06:45:13.344 1188-1188/passargad.ehsan I/dalvikvm﹕ Could not find method android.view.ViewGroup.onInitializeAccessibilityNodeInfo, referenced from method android.support.v7.widget.LinearLayoutCompat.onInitializeAccessibilityNodeInfo 
02-20 06:45:13.344 1188-1188/passargad.ehsan W/dalvikvm﹕ VFY: unable to resolve virtual method 13352: Landroid/view/ViewGroup;.onInitializeAccessibilityNodeInfo (Landroid/view/accessibility/AccessibilityNodeInfo;)V 
02-20 06:45:13.344 1188-1188/passargad.ehsan D/dalvikvm﹕ VFY: replacing opcode 0x6f at 0x0006 
02-20 06:45:13.344 1188-1188/passargad.ehsan D/dalvikvm﹕ VFY: dead code 0x0009-0011 in Landroid/support/v7/widget/LinearLayoutCompat;.onInitializeAccessibilityNodeInfo (Landroid/view/accessibility/AccessibilityNodeInfo;)V 
02-20 06:45:13.374 1188-1188/passargad.ehsan I/KeyCharacterMap﹕ No keyboard for id -1 
02-20 06:45:13.374 1188-1188/passargad.ehsan I/KeyCharacterMap﹕ Using default keymap: /system/usr/keychars/qwerty.kcm.bin 
02-20 06:45:13.504 1188-1190/passargad.ehsan D/dalvikvm﹕ GC_CONCURRENT freed 206K, 46% free 3077K/5639K, external 0K/0K, paused 5ms+11ms 
02-20 06:45:16.858 1188-1190/passargad.ehsan D/dalvikvm﹕ GC_CONCURRENT freed 263K, 44% free 3317K/5895K, external 0K/0K, paused 5ms+6ms 
02-20 06:45:17.088 1188-1190/passargad.ehsan D/dalvikvm﹕ GC_CONCURRENT freed 252K, 43% free 3485K/6087K, external 0K/0K, paused 5ms+6ms 
02-20 06:45:17.208 1188-1199/passargad.ehsan I/dalvikvm﹕ Could not find method java.lang.Throwable.addSuppressed, referenced from method de.measite.minidns.Client.query 
02-20 06:45:17.208 1188-1199/passargad.ehsan W/dalvikvm﹕ VFY: unable to resolve virtual method 14707: Ljava/lang/Throwable;.addSuppressed (Ljava/lang/Throwable;)V 
02-20 06:45:17.208 1188-1199/passargad.ehsan D/dalvikvm﹕ VFY: replacing opcode 0x6e at 0x006f 
02-20 06:45:17.208 1188-1199/passargad.ehsan I/dalvikvm﹕ Could not find method java.lang.Throwable.addSuppressed, referenced from method de.measite.minidns.Client.query 
02-20 06:45:17.208 1188-1199/passargad.ehsan W/dalvikvm﹕ VFY: unable to resolve virtual method 14707: Ljava/lang/Throwable;.addSuppressed (Ljava/lang/Throwable;)V 
02-20 06:45:17.218 1188-1199/passargad.ehsan D/dalvikvm﹕ VFY: replacing opcode 0x6e at 0x009d 
02-20 06:45:17.218 1188-1199/passargad.ehsan I/dalvikvm﹕ Could not find method java.lang.Throwable.addSuppressed, referenced from method de.measite.minidns.Client.query 
02-20 06:45:17.218 1188-1199/passargad.ehsan W/dalvikvm﹕ VFY: unable to resolve virtual method 14707: Ljava/lang/Throwable;.addSuppressed (Ljava/lang/Throwable;)V 
02-20 06:45:17.218 1188-1199/passargad.ehsan D/dalvikvm﹕ VFY: replacing opcode 0x6e at 0x00b4 
02-20 06:45:17.218 1188-1199/passargad.ehsan D/dalvikvm﹕ VFY: dead code 0x0072-0072 in Lde/measite/minidns/Client;.query (Lde/measite/minidns/Question;Ljava/lang/String;I)Lde/measite/minidns/DNSMessage; 
02-20 06:45:17.218 1188-1199/passargad.ehsan D/dalvikvm﹕ VFY: dead code 0x00a0-00a0 in Lde/measite/minidns/Client;.query (Lde/measite/minidns/Question;Ljava/lang/String;I)Lde/measite/minidns/DNSMessage; 
02-20 06:45:17.218 1188-1199/passargad.ehsan D/dalvikvm﹕ VFY: dead code 0x00b7-00b7 in Lde/measite/minidns/Client;.query (Lde/measite/minidns/Question;Ljava/lang/String;I)Lde/measite/minidns/DNSMessage; 
02-20 06:45:17.428 1188-1190/passargad.ehsan D/dalvikvm﹕ GC_CONCURRENT freed 273K, 42% free 3647K/6279K, external 0K/0K, paused 4ms+6ms 
02-20 06:45:17.688 1188-1190/passargad.ehsan D/dalvikvm﹕ GC_CONCURRENT freed 403K, 44% free 3652K/6407K, external 0K/0K, paused 5ms+5ms 
02-20 06:45:17.979 1188-1199/passargad.ehsan D/connected﹕ yes connected successfully : 
02-20 06:45:18.519 1188-1190/passargad.ehsan D/dalvikvm﹕ GC_CONCURRENT freed 323K, 42% free 3739K/6407K, external 0K/0K, paused 5ms+6ms 
02-20 06:45:18.669 1188-1193/passargad.ehsan I/dalvikvm﹕ Jit: resizing JitTable from 512 to 1024 
02-20 06:45:18.779 1188-1193/passargad.ehsan D/dalvikvm﹕ null clazz in OP_INSTANCE_OF, single-stepping 
02-20 06:45:19.460 1188-1190/passargad.ehsan D/dalvikvm﹕ GC_CONCURRENT freed 479K, 43% free 3737K/6535K, external 0K/0K, paused 5ms+6ms 
02-20 06:45:20.221 1188-1190/passargad.ehsan D/dalvikvm﹕ GC_CONCURRENT freed 486K, 43% free 3742K/6535K, external 0K/0K, paused 5ms+6ms 
02-20 06:45:20.371 1188-1199/passargad.ehsan D/connected﹕ yes authenticated successfully : 
02-20 06:45:20.391 1188-1199/passargad.ehsan D/﹕ user id :: [email protected]/Smack 
02-20 06:45:20.411 1188-1188/passargad.ehsan D/﹕ onPostExecute

預先感謝您!

回答

1

就讓我們來看看通過代碼,我發現了幾個錯誤:

  1. createChat預期的第一個參數是userJid(不是主機IP)

    Chat newChat = chatmanager.createChat("[email protected]<service name>" ,new ChatMessageListener() { 
        @Override 
        public void processMessage(Chat chat, Message message) { 
         Log.d("","message :"+ message.getBody()); 
        } 
    }); 
    
  2. 啓用調試和檢查日誌

    connection = new XMPPTCPConnection(
         XMPPTCPConnectionConfiguration.builder() 
           .setServiceName("192.168.1.6") 
           .setUsernameAndPassword("ehsan", "123") 
           .setPort(9090) 
           .setSecurityMode(ConnectionConfiguration.SecurityMode.disabled) 
           .setCompressionEnabled(false) 
           .setDebuggerEnabled(true) 
           .build()); 
    
  3. 將端口從9090更改爲5222(如果您沒有更改默認配置;檢查openfire管理面板)

  4. 優選使用addAsyncStanzaListener偵聽傳入數據包。

+0

感謝您的評論。是你說的jid「[email protected]/Smack」如果不是,請你讓我知道什麼應該放在服務名稱 –

+0

當我得到userJID它是ehsan @ passargad-pc/Smack。 passargad-pc是openfire正在運行的筆記本電腦。其本地ip爲192.168.1.6。 –

+0

在createChat應該用username作爲接收用戶名嗎? –