【问题标题】:XMPP Smack can not receive the messageXMPP Smack 收不到消息
【发布时间】:2016-06-01 19:38:00
【问题描述】:

我阅读了很多关于如何通过 smack 4.1 发送和接收消息的相关帖子 和 openFire 。据我了解,我实现了以下代码

我可以连接,我可以登录。但是当发送消息表单 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("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());
                                    }
                                });;
                        }
                    });

        }

    }

}

这里是 logcat:

02-20 06:45:13.334 1188-1188/passargad.ehsan I/dalvikvm﹕找不到方法 android.view.ViewGroup.onInitializeAccessibilityEvent,引用自方法 android.support.v7.widget.LinearLayoutCompat.onInitializeAccessibilityEvent
02-20 06:45:13.334 1188-1188/passargad.ehsan W/dalvikvm: VFY: 无法解析虚拟方法 13351: Landroid/view/ViewGroup;.onInitializeAccessibilityEvent (Landroid/view/accessibility/AccessibilityEvent;)V
02-20 06:45:13.334 1188-1188/passargad.ehsan D/dalvikvm: VFY: 在 0x0006 处替换操作码 0x6f
02-20 06:45:13.334 1188-1188/passargad.ehsan D/dalvikvm: VFY: Landroid/support/v7/widget/LinearLayoutCompat;.onInitializeAccessibilityEvent (Landroid/view/accessibility/AccessibilityEvent;)V 中的死代码 0x0009-0011
02-20 06:45:13.344 1188-1188/passargad.ehsan W/dalvikvm: VFY: 无法找到签名中引用的类 (Landroid/view/accessibility/AccessibilityNodeInfo;)
02-20 06:45:13.344 1188-1188/passargad.ehsan I/dalvikvm﹕找不到方法 android.view.ViewGroup.onInitializeAccessibilityNodeInfo,引用自方法 android.support.v7.widget.LinearLayoutCompat.onInitializeAccessibilityNodeInfo
02-20 06:45:13.344 1188-1188/passargad.ehsan W/dalvikvm: VFY: 无法解析虚拟方法 13352: Landroid/view/ViewGroup;.onInitializeAccessibilityNodeInfo (Landroid/view/accessibility/AccessibilityNodeInfo;)V
02-20 06:45:13.344 1188-1188/passargad.ehsan D/dalvikvm: VFY: 在 0x0006 处替换操作码 0x6f
02-20 06:45:13.344 1188-1188/passargad.ehsan D/dalvikvm: VFY: Landroid/support/v7/widget/LinearLayoutCompat;.onInitializeAccessibilityNodeInfo (Landroid/view/accessibility/AccessibilityNodeInfo;)V 中的死代码 0x0009-0011
02-20 06:45:13.374 1188-1188/passargad.ehsan I/KeyCharacterMap﹕没有 id -1 的键盘
02-20 06:45:13.374 1188-1188/passargad.ehsan I/KeyCharacterMap:使用默认键盘映射:/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﹕找不到方法 java.lang.Throwable.addSuppressed,引用自方法 de.measite.minidns.Client.query
02-20 06:45:17.208 1188-1199/passargad.ehsan W/dalvikvm: VFY: 无法解析虚拟方法 14707: Ljava/lang/Throwable;.addSuppressed (Ljava/lang/Throwable;)V
02-20 06:45:17.208 1188-1199/passargad.ehsan D/dalvikvm: VFY: 在 0x006f 处替换操作码 0x6e
02-20 06:45:17.208 1188-1199/passargad.ehsan I/dalvikvm﹕找不到方法 java.lang.Throwable.addSuppressed,引用自方法 de.measite.minidns.Client.query
02-20 06:45:17.208 1188-1199/passargad.ehsan W/dalvikvm: VFY: 无法解析虚拟方法 14707: Ljava/lang/Throwable;.addSuppressed (Ljava/lang/Throwable;)V
02-20 06:45:17.218 1188-1199/passargad.ehsan D/dalvikvm: VFY: 在 0x009d 处替换操作码 0x6e
02-20 06:45:17.218 1188-1199/passargad.ehsan I/dalvikvm﹕找不到方法 java.lang.Throwable.addSuppressed,引用自方法 de.measite.minidns.Client.query
02-20 06:45:17.218 1188-1199/passargad.ehsan W/dalvikvm: VFY: 无法解析虚拟方法 14707: Ljava/lang/Throwable;.addSuppressed (Ljava/lang/Throwable;)V
02-20 06:45:17.218 1188-1199/passargad.ehsan D/dalvikvm: VFY: 在 0x00b4 替换操作码 0x6e
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;
02-20 06:45:17.218 1188-1199/passargad.ehsan D/dalvikvm: VFY: Lde/measite/minidns/Client 中的死代码 0x00a0-00a0;.query (Lde/measite/minidns/Question;Ljava/lang/字符串;I)Lde/measite/minidns/DNSMessage;
02-20 06:45:17.218 1188-1199/passargad.ehsan D/dalvikvm: VFY: Lde/measite/minidns/Client 中的死代码 0x00b7-00b7;.query (Lde/measite/minidns/Question;Ljava/lang/字符串;I)Lde/measite/minidns/DNSMessage;
02-20 06:45:17.428 1188-1190/passargad.ehsan D/dalvikvm: GC_CONCURRENT 释放 273K,42% 释放 3647K/6279K,外部 0K/0K,暂停 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﹕是连接成功:
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: 将 JitTable 的大小从 512 调整为 1024
02-20 06:45:18.779 1188-1193/passargad.ehsan D/dalvikvm: OP_INSTANCE_OF 中的 null clazz,单步
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:是的,认证成功:
02-20 06:45:20.391 1188-1199/passargad.ehsan D/: 用户 id :: ehsan@passargad-pc/Smack
02-20 06:45:20.411 1188-1188/passargad.ehsan D/: onPostExecute

提前谢谢你!

【问题讨论】:

    标签: java android xmpp smack


    【解决方案1】:

    快速浏览代码,发现了几个错误:

    1. 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. 启用调试并检查日志

      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 来监听传入的数据包。

    【讨论】:

    • 感谢您的评论。是你说的“ehsan@192.168.1.9/Smack”吗?如果不是,请告诉我应该为服务名称放置什么
    • 当我得到 userJID 时,它是 ehsan@passargad-pc/Smack。 passargad-pc 是我运行 openfire 的笔记本电脑。它的本地ip是192.168.1.6。
    • 在 createChat 中的用户名应该是接收者用户名吗?
    • 我发现了问题。正如你所说,服务名称不应该是主机 IP。在 openfire 管理员中,我发现服务器名称是“passargad-pc”,我从这个链接difference between XMPP servername and XMPP servicename? 发现服务器名称和服务名称是相同的
    • 这是新的。默认情况下,9090 用于管理面板,5222 用于 TCP 连接,7070 用于 BOSH 连接。我将不得不研究为什么它们都可以工作,但在那之前只喜欢 5222 :)
    【解决方案2】:

    我不确定这是否会对您有所帮助,但我可以使用此代码得到回复:

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

    【讨论】:

      【解决方案3】:

      这个例子可能对你有用:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-05-31
        • 2016-10-26
        • 1970-01-01
        • 2016-09-30
        • 1970-01-01
        • 1970-01-01
        • 2011-06-27
        相关资源
        最近更新 更多