【问题标题】:How to create and join group in Android XMPP Multi User Chat using Smack如何使用 Smack 在 Android XMPP 多用户聊天中创建和加入群组
【发布时间】:2017-08-11 17:29:09
【问题描述】:

我正在尝试为我的应用程序制作多用户聊天。我已经完成了单用户通信的编码,它工作正常。我无法在多用户聊天中创建或加入群组。下面是我的代码。

public class MyXMPP {

public static boolean connected = false;
public boolean loggedin = false;
public static boolean isconnecting = false;
public static boolean isToasted = true;
private boolean chat_created = false;
private String serviceName = "", hostAddress = "";
public static XMPPTCPConnection connection;
public static String loginUser;
public static String passwordUser;
XmppService context;
public static MyXMPP instance = null;
public static boolean instanceCreated = false;
private static ChatHandler chatHandler;
private MultiUserChat mMultiUserChat;
private MultiUserChatManager manager;

public String roomName = "new";
public String serverName = "conference.";

public MyXMPP(XmppService context, String mServiceName, String mHostAddress, String loginUser, String passwordUser) {
    this.serviceName = mServiceName;
    this.hostAddress = mHostAddress;
    this.loginUser = loginUser;
    this.passwordUser = passwordUser;
    this.context = context;
    init();
}

public static MyXMPP getInstance(XmppService context, String mServiceName, String mHostAddress, String user, String pass) {
    if (instance == null) {
        instance = new MyXMPP(context, mServiceName, mHostAddress, user, pass);
        instanceCreated = true;
    }
    return instance;

}

public org.jivesoftware.smack.chat.Chat Mychat;

ChatManagerListenerImpl mChatManagerListener;
MMessageListener mMessageListener;

String text = "";
String mMessage = "", mReceiver = "";

static {
    try {
        Class.forName("org.jivesoftware.smack.ReconnectionManager");
    } catch (ClassNotFoundException ex) {
        // problem loading reconnection manager
    }
}

public void init() {
    mMessageListener = new MMessageListener(context);
    mChatManagerListener = new ChatManagerListenerImpl();
    initialiseConnection();
}

private void initialiseConnection() {

    XMPPTCPConnectionConfiguration.Builder config = XMPPTCPConnectionConfiguration.builder();
    config.setSecurityMode(ConnectionConfiguration.SecurityMode.disabled);
    config.setServiceName(serviceName);
    config.setHost(hostAddress);
    config.setDebuggerEnabled(true);
    XMPPTCPConnection.setUseStreamManagementResumptiodDefault(true);
    XMPPTCPConnection.setUseStreamManagementDefault(true);
    connection = new XMPPTCPConnection(config.build());
    XMPPConnectionListener connectionListener = new XMPPConnectionListener();
    connection.addConnectionListener(connectionListener);

}

public void disconnect() {
    new Thread(new Runnable() {
        @Override
        public void run() {
            connection.disconnect();
        }
    }).start();
}

public void connect(final String caller) {

    AsyncTask<Void, Void, Boolean> connectionThread = new AsyncTask<Void, Void, Boolean>() {
        @Override
        protected synchronized Boolean doInBackground(Void... arg0) {
            if (connection.isConnected())
                return false;
            isconnecting = true;
            if (isToasted)
                new Handler(Looper.getMainLooper()).post(new Runnable() {

                    @Override
                    public void run() {

                        Toast.makeText(context,
                                caller + "=>connecting....",
                                Toast.LENGTH_LONG).show();
                    }
                });
            Log.d("Connect() Function", caller + "=>connecting....");

            try {

                connection.connect();

                ReconnectionManager reconnectionManager = ReconnectionManager.getInstanceFor(connection);
                reconnectionManager.setEnabledPerDefault(false);
                reconnectionManager.enableAutomaticReconnection();

                DeliveryReceiptManager dm = DeliveryReceiptManager
                        .getInstanceFor(connection);
                dm.setAutoReceiptMode(AutoReceiptMode.always);
                dm.addReceiptReceivedListener(new ReceiptReceivedListener() {

                    @Override
                    public void onReceiptReceived(final String fromid,
                                                  final String toid, final String msgid,
                                                  final Stanza packet) {

                    }
                });

                connected = true;

            } catch (IOException e) {
                Log.e("(" + caller + ")", "IOException: " + e.getMessage());
            } catch (SmackException e) {
                Log.e("(" + caller + ")",
                        "SMACKException: " + e.getMessage());
            } catch (XMPPException e) {
                Log.e("connect(" + caller + ")",
                        "XMPPException: " + e.getMessage());

            }
            return isconnecting = false;
        }
    };
    connectionThread.execute();
}

public void login() {

    try {

        connection.login(loginUser, passwordUser);
        Log.i("LOGIN", "Yey! We're connected to the Xmpp server!");


                // Call to create Multi User Chat Group
                join();    

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

}

private class ChatManagerListenerImpl implements ChatManagerListener {
    @Override
    public void chatCreated(final org.jivesoftware.smack.chat.Chat chat,
                            final boolean createdLocally) {
        if (!createdLocally)
            chat.addMessageListener(mMessageListener);

    }

}


public int sendMessage(String senderID, String mMessage) {

    if (!chat_created) {
        Mychat = ChatManager.getInstanceFor(connection).createChat(senderID, mMessageListener);
        chat_created = true;
    }
    final Message message = new Message();
    message.setBody(mMessage);
    message.setStanzaId(String.format("%02d", new Random().nextInt(1000)));
    message.setType(Message.Type.chat);
    try {
        if (connection.isAuthenticated()) {
            Mychat.sendMessage(message);
            return 1;
        } else {
            login();
            return 0;
        }
    } catch (SmackException.NotConnectedException e) {

        Log.e("xmpp.SendMessage()", "msg Not sent!-Not Connected!");
        return 0;

    } catch (Exception e) {

        Log.e("xmpp Message Exception", "msg Not sent!" + e.getMessage());
        return 0;
    }

}

public class XMPPConnectionListener implements ConnectionListener {
    @Override
    public void connected(final XMPPConnection connection) {

        Log.d("xmpp", "Connected!");
        connected = true;
        if (!connection.isAuthenticated()) {
            login();
        }
    }

    @Override
    public void connectionClosed() {
        if (isToasted)

            Log.d("xmpp", "ConnectionCLosed!");

        System.out.println("-------------ConnectionCLosed!----------------");
        instance = null;
        connected = false;
        chat_created = false;
        loggedin = false;
    }

    @Override
    public void connectionClosedOnError(Exception arg0) {

        Log.d("xmpp", "ConnectionClosedOn Error!");
        connected = false;
        instance = null;
        chat_created = false;
        loggedin = false;
    }

    @Override
    public void reconnectingIn(int arg0) {

        Log.d("xmpp", "Reconnectingin " + arg0);

        System.out.println("----------prem Reconnectingin----------------" + arg0);

        loggedin = false;
    }

    @Override
    public void reconnectionFailed(Exception arg0) {

        Log.d("xmpp", "ReconnectionFailed!");
        connected = false;
        instance = null;
        chat_created = false;
        loggedin = false;
    }

    @Override
    public void reconnectionSuccessful() {

        Log.d("xmpp", "ReconnectionSuccessful");
        connected = true;

        chat_created = false;
        loggedin = false;
    }

    @Override
    public void authenticated(XMPPConnection arg0, boolean arg1) {
        Log.d("xmpp", "Authenticated!");
        loggedin = true;

        ChatManager.getInstanceFor(connection).addChatListener(
                mChatManagerListener);

        chat_created = false;
        new Thread(new Runnable() {

            @Override
            public void run() {
                try {
                    Thread.sleep(500);
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }

            }
        }).start();

    }
}

private class MMessageListener implements ChatMessageListener {

    public MMessageListener(Context contxt) {
    }

    @Override
    public void processMessage(final org.jivesoftware.smack.chat.Chat chat,
                               final Message message) {
        Log.i("MyXMPP_MESSAGE_LISTENER", "Xmpp message received: '"
                + message);

        if (message.getType() == Message.Type.chat
                && message.getBody() != null) {
            System.out.println("-----------xmpp message-------------" + message.getBody());

            // Here I am receiving messages which would be handled later
        }
    }

}


public boolean join(){
  try {
        MultiUserChatManager multiUserChatManager = MultiUserChatManager.getInstanceFor(connection);
        MultiUserChat multiUserChat = multiUserChatManager.getMultiUserChat(roomName + "@" + serverName + ServiceConstant.XMPP_HOST_URL);
        multiUserChat.addMessageListener(new MessageListener() {
            @Override
            public void processMessage(Message message) {
                Log.i("MyXMPP_MESSAGE_LISTENER", "Xmpp message received: '"
                        + message);


            }
        });

       // Getting Error at the below line. 
       multiUserChat.createOrJoin(loginUser);

      return true;


    }catch (Exception e){
        e.printStackTrace();
    }

    return false;
}

}

在调用 join() 函数时尝试执行上述代码时出现 XMPP 错误。

multiUserChat.createOrJoin(loginUser) 这个地方出错。

XMPPError: remote-server-not-found - 取消 org.jivesoftware.smack.PacketCollector.nextResultOrThrow(PacketCollector.java:220) 在 org.jivesoftware.smackx.muc.MultiUserChat.enter(MultiUserChat.java:311) 在 org.jivesoftware.smackx.muc.MultiUserChat.createOrJoin(MultiUserChat.java:400) 在 org.jivesoftware.smackx.muc.MultiUserChat.createOrJoin(MultiUserChat.java:376)

请帮助我。提前致谢。

【问题讨论】:

  • 问题是我使用了错误的参数MultiUserChat multiUserChat = multiUserChatManager.getMultiUserChat(roomName + "@" + serverName + ServiceConstant.XMPP_HOST_URL); 我应该在这里使用XMPP 服务名称 而不是XMPP 主机url。当我将 XMPP_HOST_URL 替换为 XMPP_SERVICE_NAME MultiUserChat multiUserChat = multiUserChatManager.getMultiUserChat(roomName + "@" + serverName + ServiceConstant.XMPP_SERVICE_NAME); 时,代码运行良好

标签: android xmpp smack multiuserchat


【解决方案1】:

【讨论】:

    【解决方案2】:

    对于群聊,您需要在前面加上“会议”。使用 service_url。

    示例代码:

    final MultiUserChatManager multiUserChatManager = 
                 MultiUserChatManager.getInstanceFor(abstractXMPPConnection);
    final MultiUserChat multiUserChat = 
                 multiUserChatManager.getMultiUserChat(
                 JidCreate.entityBareFrom(groupChatRoomName + 
                              "@conference." + SERVICE_URL));
    multiUserChat.create(Resourcepart.from((groupChatRoomName))
                   .getConfigFormManager()
                   .submitConfigurationForm();
    

    【讨论】:

      【解决方案3】:

      我认为您在创建多用户聊天 (getMultiUserChat) 时没有正确传递 jabber ID。 jid 的创建方式是 roomName@conferenceServername/resourceId。您需要检查创建 JID 时需要附加的会议服务器名称。这可以通过检查服务器端的配置来完成,或者如果会议在 XMPP 端用作单独的组件,则使用 item discovery feature

      【讨论】:

        猜你喜欢
        • 2016-12-23
        • 1970-01-01
        • 2023-03-29
        • 2016-02-02
        • 2015-01-15
        • 2014-06-05
        • 1970-01-01
        • 1970-01-01
        • 2015-04-02
        相关资源
        最近更新 更多