简体   繁体   English

XMPP Smack无法收到该消息

[英]XMPP Smack can not receive the message

I read lots of related posts about how to send and receive message by smack 4.1 and openFire . 我阅读了许多有关如何通过smack 4.1和openFire发送和接收消息的相关文章。 from my understanding i implemented the following code 据我了解,我实现了以下代码

I can connect, i can login . 我可以连接,我可以登录。 but when sending message form user1 to user2 i get nothing. 但是当从user1向user2发送消息时我什么也没得到。

code: 码:

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("ehsan@192.168.1.6/Smack");
                newMessage.setTo("ehsan@192.168.1.6/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());
                                    }
                                });;
                        }
                    });

        }

    }

}

here is the logcat: 这是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 I / dalvikvm:无法从方法android.support.v7.widget.LinearLayoutCompat.onInitializeAccessibilityEvent引用的方法android.view.ViewGroup.onInitializeAccessibilityEvent\n02-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 W / dalvikvm:VFY:无法解析虚拟方法13351:Landroid / view / ViewGroup; .onInitializeAccessibilityEvent(Landroid / view / accessibility / AccessibilityEvent;)V\n02-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:在0x0006处替换操作码0x6f\n02-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.334 1188-1188 / passargad.ehsan D / dalvikvm:VFY:Landroid / support / v7 / widget / LinearLayoutCompat; .onInitializeAccessibilityEvent(Landroid / view / view / accessibility / AccessibilityEvent;)V中的无效代码0x0009-0011\n02-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 W / dalvikvm:VFY:找不到签名中引用的类(Landroid / view / accessibility / AccessibilityNodeInfo;)\n02-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 I / dalvikvm:无法找到方法android.view.ViewGroup.onInitializeAccessibilityNodeInfo,该方法是从方法android.support.v7.widget.LinearLayoutCompat.onInitializeAccessibilityNodeInfo引用的\n02-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 W / dalvikvm:VFY:无法解析虚拟方法13352:Landroid / view / ViewGroup; .onInitializeAccessibilityNodeInfo(Landroid / view / accessibility / AccessibilityNodeInfo;)V\n02-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:在0x0006处替换操作码0x6f\n02-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.344 1188-1188 / passargad.ehsan D / dalvikvm:VFY:Landroid / support / v7 / widget / LinearLayoutCompat; .onInitializeAccessibilityNodeInfo(Landroid / view / view / accessibility / AccessibilityNodeInfo;)V中的无效代码0x0009-0011\n02-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:没有ID为-1的键盘\n02-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.374 1188-1188 / passargad.ehsan I / KeyCharacterMap:使用默认键盘映射:/system/usr/keychars/qwerty.kcm.bin\n02-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:13.504 1188-1190 / passargad.ehsan D / dalvikvm:GC_CONCURRENT释放206K,46%释放3077K / 5639K,外部0K / 0K,暂停5ms + 11ms\n02-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:16.858 1188-1190 / passargad.ehsan D / dalvikvm:GC_CONCURRENT释放263K,44%释放3317K / 5895K,外部0K / 0K,暂停5ms + 6ms\n02-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.088 1188-1190 / passargad.ehsan D / dalvikvm:GC_CONCURRENT释放252K,43%释放3485K / 6087K,外部0K / 0K,暂停5ms + 6ms\n02-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 I / dalvikvm:找不到方法java.lang.Throwable.addSuppressed,从方法de.measite.minidns.Client.query引用\n02-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 W / dalvikvm:VFY:无法解析虚拟方法14707:Ljava / lang / Throwable; .addSuppressed(Ljava / lang / Throwable;)V\n02-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 D / dalvikvm:VFY:在0x006f处替换操作码0x6e\n02-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 I / dalvikvm:找不到方法java.lang.Throwable.addSuppressed,从方法de.measite.minidns.Client.query引用\n02-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 W / dalvikvm:VFY:无法解析虚拟方法14707:Ljava / lang / Throwable; .addSuppressed(Ljava / lang / Throwable;)V\n02-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 D / dalvikvm:VFY:在0x009d处替换操作码0x6e\n02-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 I / dalvikvm:找不到方法java.lang.Throwable.addSuppressed,从方法de.measite.minidns.Client.query引用\n02-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 W / dalvikvm:VFY:无法解析虚拟方法14707:Ljava / lang / Throwable; .addSuppressed(Ljava / lang / Throwable;)V\n02-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:在0x00b4处替换操作码0x6e\n02-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:Lde / measite / minidns / Client中的无效代码0x0072-0072; .query(Lde / measite / minidns / Question; Ljava / lang /字符串; I)Lde / measite / minidns / DNSMessage;\n02-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:死代码0x00a0-00a0 in Lde / measite / minidns / Client; .query(Lde / measite / minidns / Question; Ljava / lang /字符串; I)Lde / measite / minidns / DNSMessage;\n02-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.218 1188-1199 / passargad.ehsan D / dalvikvm:VFY:死代码0x00b7-00b7 in Lde / measite / minidns / Client; .query(Lde / measite / minidns / Question; Ljava / lang /字符串; I)Lde / measite / minidns / DNSMessage;\n02-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.428 1188-1190 / passargad.ehsan D / dalvikvm:GC_CONCURRENT释放了273K,42%释放了3647K / 6279K,外部0K / 0K,暂停了4ms + 6ms\n02-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.688 1188-1190 / passargad.ehsan D / dalvikvm:GC_CONCURRENT释放了403K,44%释放了3652K / 6407K,外部0K / 0K,暂停了5ms + 5ms\n02-20 06:45:17.979 1188-1199/passargad.ehsan D/connected﹕ yes connected successfully : 02-20 06:45:17.979 1188-1199 / passargad.ehsan D / connected:是已成功连接:\n02-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.519 1188-1190 / passargad.ehsan D / dalvikvm:GC_CONCURRENT释放了323K,42%释放了3739K / 6407K,外部0K / 0K,暂停了5ms + 6ms\n02-20 06:45:18.669 1188-1193/passargad.ehsan I/dalvikvm﹕ Jit: resizing JitTable from 512 to 1024 02-20 06:45:18.669 1188-1193 / passargad.ehsan I / dalvikvm:Jit:将JitTable的大小从512调整为1024\n02-20 06:45:18.779 1188-1193/passargad.ehsan D/dalvikvm﹕ null clazz in OP_INSTANCE_OF, single-stepping 02-20 06:45:18.779 1188-1193 / passargad.ehsan D / dalvikvm:OP_INSTANCE_OF中的空爵士乐,单步执行\n02-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:19.460 1188-1190 / passargad.ehsan D / dalvikvm:GC_CONCURRENT释放479K,43%释放3737K / 6535K,外部0K / 0K,暂停5ms + 6ms\n02-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.221 1188-1190 / passargad.ehsan D / dalvikvm:GC_CONCURRENT释放486K,43%释放3742K / 6535K,外部0K / 0K,暂停5ms + 6ms\n02-20 06:45:20.371 1188-1199/passargad.ehsan D/connected﹕ yes authenticated successfully : 02-20 06:45:20.371 1188-1199 / passargad.ehsan D / connected:是已成功通过身份验证:\n02-20 06:45:20.391 1188-1199/passargad.ehsan D/﹕ user id :: ehsan@passargad-pc/Smack 02-20 06:45:20.391 1188-1199 / passargad.ehsan D /:用户ID :: ehsan @ passargad-pc / Smack\n02-20 06:45:20.411 1188-1188/passargad.ehsan D/﹕ onPostExecute 02-20 06:45:20.411 1188-1188 / passargad.ehsan D /:onPostExecute 

thank you in advance! 先感谢您!

A quick look through the code, I found a few mistakes: 快速浏览一下代码,发现了一些错误:

  1. createChat expects the first argument to be userJid (not host IP) createChat希望第一个参数是userJid(不是主机IP)

     Chat newChat = chatmanager.createChat("ehsan@<service name>" ,new ChatMessageListener() { @Override public void processMessage(Chat chat, Message message) { Log.d("","message :"+ message.getBody()); } }); 
  2. Enable debugging and check logs 启用调试并检查日志

     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. Change port from 9090 to 5222 (In case you didn't change default configuration; check openfire admin panel) 将端口从9090更改为5222(以防您未更改默认配置;请检查openfire管理面板)

  4. Prefer using addAsyncStanzaListener to listen for incoming packets. 首选使用addAsyncStanzaListener侦听传入的数据包。

I am not sure if this will help you but I can get reply with this code: 我不确定这是否对您有帮助,但是可以通过以下代码得到答复:

public void chat(String AddressedUser) throws NotConnectedException {
    //Create username whom we want to send a message
    String userToSend = AddressedUser + "@" + serverDomain;

    ChatManager chatmanager = ChatManager.getInstanceFor(connection);
    Chat newChat = chatmanager.createChat(userToSend , new MessageListener() {
        @Override
        public void processMessage(Chat chat, Message message   ) {
            // TODO Auto-generated method stub
            System.out.println("Received message: " + message);

        }
    });

    try {
        newChat.sendMessage("Hello");
    }
    catch (XMPPException e) {
        System.out.println("Error Delivering block");
    }

}

This example may be useful for you: 该示例可能对您有用:

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

public class Test {
    public static void main(String args[]) throws XMPPException {
        ConnectionConfiguration config = new ConnectionConfiguration("127.0.0.1", 5222);    
        XMPPConnection connection = new XMPPConnection(config); 
        connection.connect();   
        connection.login("userx", "123456");
        ChatManager cm = connection.getChatManager(); 
        Chat chat = cm.createChat("tongqian@tsw-PC", null);
        /*
         * add listener
         */
        cm.addChatListener(new ChatManagerListener() {
            @Override
            public void chatCreated(Chat chat, boolean create) {
                chat.addMessageListener(new MessageListener() {
                    @Override
                    public void processMessage(Chat chat, Message msg) {
                        System.out.println(chat.getParticipant() + ":" + msg.getBody());
                    }
                });
            }
        });
        chat.sendMessage("hello");  
        while(true);        
        //connection.disconnect();  
    }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM