3

私はこのOpenFireとasmackに慣れていません。ユーザーにマルチユーザーチャットの機能を持たせたいので、検索したところMUCが見つかりました。ルームを作成し、他のユーザーにこれらの作品の招待状を送信するためにこれを実装しました。他のユーザーは招待されますが、他のユーザーはルームに参加できません。

私は他のユーザーの招待受信でこれをやっています

ここで、接続はこのユーザーの接続であり、部屋は招待状で取得した部屋の名前です。

MultiUserChat muc3 = new MultiUserChat(接続,部屋);

muc3.join("testbot3");

testbot3 はランダムな名前です。

しかし、これは404エラーをスローします。

招待を送信する前にユーザーに参加する必要がありますか。つまり、ユーザーが B に招待を送信する場合、招待が送信される前に、A はデフォルトでこれらのユーザーをルームに参加させる必要があり、B に依存して拒否するか、単に待機します。

私がやっていることは、B の InvitationListner で A から招待を受け取り、上記のコードで参加しようとしていることです。

私は長い間試してきましたが、何がうまくいかないのかわかりません。これを行う方法のサンプルコードを提供できる人がいます。これは私にとって大きな助けになります。

ありがとう

ここに私の問題に関する詳細情報があります

Openfire を確認すると、ユーザーが作成したルームが表示され、彼自身が所有者として追加されているので、ルームの作成に問題があるとは思いません。

部屋が完全に作成されていないときに部屋がロックされていることを読んだので、これは部屋がロックされる問題である可能性があります。これは、部屋を作成するときのフォーム入力の問題だと思います。フォーム内のパスワードは問題になる可能性がありますか?

ハンドラー内の次のコードを参照してください。メソッド「checkInvitation」を呼び出しています。これは、投稿された上記のコードと同じことを行いますが、それでも 404 が発生します。私のコードで何が間違っているのか教えてください。

追加する必要があるニックネームは何でもかまいませんか、それともユーザー固有のものにする必要がありますか?

public void createChatroom(){

    MultiUserChat muc = null;

    try {
      muc = new MultiUserChat(connection, "myroom@conference.localhost");
      muc.create("testbot");

      // Get the the room's configuration form
      Form form = muc.getConfigurationForm();
      // Create a new form to submit based on the original form
      Form submitForm = form.createAnswerForm();
      // Add default answers to the form to submit
      for (Iterator fields = form.getFields(); fields.hasNext();) {
          FormField field = (FormField) fields.next();
          if (!FormField.TYPE_HIDDEN.equals(field.getType()) && field.getVariable() != null) {
              // Sets the default value as the answer
              submitForm.setDefaultAnswer(field.getVariable());
          }
      }
      // Sets the new owner of the room
      List owners = new ArrayList();
      owners.add("admin@localhost");
      submitForm.setAnswer("muc#roomconfig_roomowners", owners);
      // Send the completed form (with default values) to the server to configure the room
      muc.sendConfigurationForm(submitForm);
      muc.join("d");

      muc.invite("b@localhost", "Meet me in this excellent room");

      muc.addInvitationRejectionListener(new InvitationRejectionListener() {
          public void invitationDeclined(String invitee, String reason) {
              // Do whatever you need here...
              System.out.println("Initee "+invitee+" reason"+reason);
          }
      });

    } catch (XMPPException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

    public void setConnection(XMPPConnection connection) {
    this.connection = connection;
    if (connection != null) {
        // Add a packet listener to get messages sent to us
        PacketFilter filter = new MessageTypeFilter(Message.Type.chat);
        connection.addPacketListener(new PacketListener() {
            public void processPacket(Packet packet) {
                Message message = (Message) packet;
                if (message.getBody() != null) {
                    String fromName = StringUtils.parseBareAddress(message
                            .getFrom());
                    Log.i("XMPPClient", "Got text [" + message.getBody()
                            + "] from [" + fromName + "]");
                    messages.add(fromName + ":");
                    messages.add(message.getBody());
                    // Add the incoming message to the list view
                    mHandler.post(new Runnable() {
                        public void run() {
                            setListAdapter();
                            checkInvitation();
                        }
                    });
                }
            }
        }, filter);


        mHandler.post(new Runnable() {
            public void run() {
                checkInvitation();
            }
        });
    }
}
4

3 に答える 3

9

404 エラーは、次のことを示しています。

404 error can occur if the room does not exist or is locked

そのため、部屋がロックされていないか、存在していないことを確認してください。以下のコードは、招待状が届いたときにルームに参加する方法です。

private void setChatRoomInvitationListener() {
    MultiUserChat.addInvitationListener(mXmppConnection,
            new InvitationListener() {

                @Override
                public void invitationReceived(Connection connection,
                        String room, String inviter, String reason,
                        String unKnown, Message message) {

                    //MultiUserChat.decline(mXmppConnection, room, inviter,
                        //  "Don't bother me right now");
                    // MultiUserChat.decline(mXmppConnection, room, inviter,
                    // "Don't bother me right now");
                    try {
                       muc.join("test-nick-name");
                       Log.e("abc","join room successfully");
                       muc.sendMessage("I joined this room!! Bravo!!");
                    } catch (XMPPException e) {
                       e.printStackTrace();
                       Log.e("abc","join room failed!");
                    }
                }
            });
}

これがあなたのエラーに役立つことを願っています!

編集:これは私が部屋を設定する方法です:

 /*
         * Create room
         */
        muc.create(roomName);

        // muc.sendConfigurationForm(new Form(Form.TYPE_SUBMIT));
        Form form = muc.getConfigurationForm();
        Form submitForm = form.createAnswerForm();

        for (Iterator fields = form.getFields(); fields.hasNext();) {
            FormField field = (FormField) fields.next();
            if (!FormField.TYPE_HIDDEN.equals(field.getType())
                    && field.getVariable() != null) {
                show("field: " + field.getVariable());
                // Sets the default value as the answer
                submitForm.setDefaultAnswer(field.getVariable());
            }
        }

        List<String> owners = new ArrayList<String>();
        owners.add(DataConfig.USERNAME + "@" + DataConfig.SERVICE);
        submitForm.setAnswer("muc#roomconfig_roomowners", owners);
        submitForm.setAnswer("muc#roomconfig_roomname", roomName);
        submitForm.setAnswer("muc#roomconfig_persistentroom", true);

        muc.sendConfigurationForm(submitForm);
        // submitForm.
        show("created room!");
        muc.addMessageListener(new PacketListener() {
            @Override
            public void processPacket(Packet packet) {
                show(packet.toXML());
                Message mess = (Message) packet;
                showMessageToUI(mess.getFrom() + ": " + mess.getBody());
            }
        });

この構成で、パスワードなしで簡単にルームに参加できます。

于 2013-01-23T10:52:49.840 に答える