【问题标题】:Problem in receiving first Message by SmackSmack 接收第一条消息时出现问题
【发布时间】:2011-05-07 05:48:03
【问题描述】:

我使用下面的代码来发送消息。

 // Assume we've created an XMPPConnection name "connection".
ChatManager chatmanager = connection.getChatManager();
Chat newChat = chatmanager.createChat("jsmith@jivesoftware.com", new MessageListener() {
    public void processMessage(Chat chat, Message message) {
        System.out.println("Received message: " + message);
    }
});

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

下面用于异步接收发送到我的 JabberID 的消息。

// Create a packet filter to listen for new messages from a particular
// user. We use an AndFilter to combine two other filters.
PacketFilter filter = new AndFilter(new PacketTypeFilter(Message.class), 
        new FromContainsFilter("mary@jivesoftware.com"));
// Assume we've created an XMPPConnection name "connection".

// First, register a packet collector using the filter we created.
PacketCollector myCollector = connection.createPacketCollector(filter);
// Normally, you'd do something with the collector, like wait for new packets.

// Next, create a packet listener. We use an anonymous inner class for brevity.
PacketListener myListener = new PacketListener() {
        public void processPacket(Packet packet) {
            // Do something with the incoming packet here.
        }
    };
// Register the listener.
connection.addPacketListener(myListener, filter);

发送消息没问题。

但是在我向那个 JabberID 发送消息之前,我无法从另一个 JabberID 接收消息。

然后我正确地接收到它发送的消息。

请注意,我经常需要从不在我的列表中的 jabberID 接收消息,而且我的应用程序通常不是开始聊天的一方。

上面的代码是 smack 示例,但我的代码完全一样,除了我没有创建 PacketListener 内联实现。

【问题讨论】:

  • 当我在考虑您的问题时,请仔细查看debugging with smack。 simlpy 打开调试器后,我几乎可以解决所有问题;-)
  • 你的代码是否完整?我没有调用 myCollector.nextPacket()...

标签: java xmpp smack


【解决方案1】:

当我停止使用 Jabber 客户端并在测试程序期间登录同一用户时,我的问题解决了。 换句话说,代码是正确的,但 Jabber 客户端会捕获已发送的消息,并且我的程序无法捕获任何内容。

【讨论】:

    【解决方案2】:

    自从我使用 smack 已经有一段时间了,但我设法根据收到的消息开始聊天。

    如果我没记错的话,我有某种“ChatRegistry”,一个简单的Map<String, Chat>,其中的键等于聊天伙伴ID。然后我收听传入的消息,提取 jabber id 并查找与该合作伙伴的活动聊天会话。如果没有活动会话,我创建了一个新的聊天并将新的键/值对添加到注册表中。

    【讨论】:

    • 我找不到 ChatRegistry 或类似的东西,我认为您的建议中有一个错误的循环:如果我知道谁想给我发消息,那么就没有问题。
    【解决方案3】:

    只是有点困惑。你说

    上面的代码是 smack 示例,但我的代码完全一样,除了我没有创建 PacketListener 实现内联。

    如何在没有 PacketListener 实现的情况下接收消息?我认为由于下面的代码,您总是会收到来自您开始的聊天的消息

    聊天 newChat = chatmanager.createChat("jsmith@jivesoftware.com", new MessageListener() { public void processMessage(Chat chat, Message message) { System.out.println("收到消息:" + message); } });

    但为了异步等待传入消息,我认为您需要一个 PacketListener。 我可能完全误解了你面临的问题

    (这应该是评论,但我不知道如何添加)

    【讨论】:

    • 1.我实现 PacketListener 但不是内联
    【解决方案4】:

    好久不见,你解决了吗?你为什么要创建 FromContainsFilter?这样,您的侦听器仅处理来自给定用户的数据包,而不是所有数据包。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-24
      • 2023-03-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多