当前位置: 首页 > 知识库问答 >
问题:

XMPP:Smack客户端未接收聊天消息

王航
2023-03-14

我一直在努力通过Smack和Openfire服务器与XMPP聊天。我的问题如下:

每当一个用户向另一个用户发送消息时,该消息就会在另一个用户处正确接收。但是任何回复都不会出现在第一条消息的发件人处。因此,用户1成功地发送给用户2。然后,用户2无法向用户1发送任何回复。另一方面,如果我重新启动并让用户再次登录,则用户2可以发送给用户1,但反之亦然。

我想说的是,只有聊天的发起者才能发送消息,接收者不能回复。

我的代码如下所示

    package xmpp;


public class XMPPClient{

private static final int packetReplyTimeout = 500; // millis
private XMPPConnection connection;
private ChatManager chatManager;
private MessageListener messageListener;
private ConnectionConfiguration config;
private MyTimer t = MyTimer.getInstance();
private ArrayList<String> threadPool = new ArrayList<String>();

public XMPPClient()
{
    SmackConfiguration.setPacketReplyTimeout(packetReplyTimeout);

    //define openfire server information

    config = new ConnectionConfiguration("localhost",5222);
    config.setSASLAuthenticationEnabled(false);
    config.setSecurityMode(SecurityMode.disabled);

    connection = new XMPPConnection(config);

    //connect to server
    t.start("Connecting to server...");
    try {
        connection.connect();
    } catch (XMPPException e) {
        System.err.println("Failed to connect to server! Connect to VPN!\t"+e.getMessage());
        System.exit(0);
    }
    t.end("Connection took ");

    //setup chat mechanism
    chatManager = connection.getChatManager();
    chatManager.addChatListener(
            new ChatManagerListener() {
                @Override
                public void chatCreated(Chat chat, boolean createdLocally)
                {
                    if (!createdLocally)
                        chat.addMessageListener(new MyMessageListener());
                }
    });
}
public boolean login(String userName, String password, String resource) {       
    t.start("Logging in...");
    try {
        if (connection!=null && connection.isConnected()) 
            connection.login(userName, password, resource);
        //set available presence
        setStatus(true);
    } 
    catch (XMPPException e) {
        if(e.getMessage().contains("auth")){
            System.err.println("Invalid Login Information!\t"+e.getMessage());
        }
        else{
            e.printStackTrace();
        }
        return false;
    }
    t.end("Logging in took ");
    return true;
}
public void setStatus(boolean available) {
    if(available)
        connection.sendPacket(new Presence(Presence.Type.available));
    else
        connection.sendPacket(new Presence(Presence.Type.unavailable));
}

public void sendMessage(String message, String buddyJID) throws XMPPException {
    System.out.println(String.format("Sending mesage '%1$s' to user %2$s", message, buddyJID));
    boolean chatExists = false;
    Chat c = null;
    for(String tid : threadPool)
    {
        if((c = chatManager.getThreadChat(tid)) != null)
        {
            if(c.getParticipant().equals(buddyJID))
            {
                if(checkAvailability(buddyJID))
                {
                    chatExists = true;
                    break;
                }
                else
                {
                    threadPool.remove(tid);
                    break;
                }
            }
        }
    }
    if (chatExists)
    {
        Chat chat = c;
        chat.sendMessage(message);
    }
    else
    {
        Chat chat = chatManager.createChat(buddyJID, messageListener);
        threadPool.add(chat.getThreadID()); System.out.println(chat.getThreadID());
        chat.sendMessage(message);
    }
}

public void createEntry(String user, String name) throws Exception {
    System.out.println(String.format("Creating entry for buddy '%1$s' with name %2$s", user, name));
    Roster roster = connection.getRoster();
    roster.createEntry(user, name, null);
}

public boolean checkAvailability(String jid)
{
    System.out.print("Checking availability for: "+jid+"=");
    System.out.println(connection.getRoster().getPresence(jid).isAvailable());
    return connection.getRoster().getPresence(jid).isAvailable();
}

public void disconnect() {
    if (connection!=null && connection.isConnected()) {
        setStatus(false);
        connection.disconnect();
    }
}

}

import org.jivesoftware.smack.packet.Message;

public class MyMessageListener implements MessageListener {
@Override
public void processMessage(Chat chat, Message message) {
    String from = message.getFrom();
    String body = message.getBody();
    System.out.println(String.format("Received message '%1$s' from %2$s", body, from));
}

}

我不确定是什么问题。有什么建议吗?示例代码?

谢谢

共有3个答案

云鸿达
2023-03-14

is代码非常复杂,似乎只用于发送MSG。以下是一个在发送和接收时都能正常工作的示例代码:

http://www.javaprogrammingforums.com/java-networking-tutorials/551-how-write-simple-xmpp-jabber-client-using-smack-api.html

史超英
2023-03-14

例如,如果它是一个现有的客户机(比如Spark),您还没有指定接收者是什么,或者更多的自定义代码。这会很有帮助,因为知道您使用的是哪个版本的Smack。

该特定代码有几个问题。

  • 它不断为发送的每条消息创建新的聊天对象,而不是简单地重复使用同一个聊天
慕胡媚
2023-03-14

我不确定这是否对您有帮助,但我可以通过以下代码获得回复:

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("Hey");
    }
    catch (XMPPException e) {
        System.out.println("Error Delivering block");
    }

}

我发送“嘿”,然后其他用户写什么,我会在我的日志中看到。

 类似资料:
  • 我对python有点陌生,这是我第一次使用套接字,我试图制作一个具有客户端和服务器的应用程序,用户可以在客户端中输入,它将被发送到服务器,然后将其发送给所有其他客户端。我已经将其设置为工作状态,但每当我尝试发送第二条消息时,我总是收到一个错误错误:[Errno 10058]发送或接收数据的请求被禁止,因为套接字已经在之前的关闭调用中关闭了该方向。我如何才能做到这一点? 尝试在启动新套接字或发送新消

  • 如何在聊天客户端发送媒体消息?我使用的是JS SDK,基于教程https://www.twilio.com/docs/api/chat/guides/media-support,但是出现了错误。我使用的方法如下所示: 错误消息:

  • 我有客户端服务器聊天 客户端发送文件,服务器接收它们。但是,问题是,我不认为文件被正确接收,因为当我检查文件的大小时,我看到由于某些原因差异是一半! 我正在使用GUI在客户端浏览文件,然后我向服务器发送命令以知道客户端正在发送文件。但是它不工作 这里是客户端和服务器 计算机网络服务器 有人能帮我解决这个问题吗?因为我不知道如何正确发送和接收文件 谢谢你

  • 问题内容: 我正在尝试用两个客户端实现一个系统,其中一个客户端发送一条消息,而另一个客户端将接收该消息。下图将以更直观的方式对其进行解释: 因此,客户端1将消息发送到服务器(此工作正常),服务器接收到“推送”消息并发出应由客户端2接收的“弹出”消息。这里的问题是客户端2从未收到“流行”消息。:( 这是所有代码。 SERVER.JS 客户1(aka mobile.html) 客户2(aka web.

  • 我在远程机器上设置了Kafka和动物园管理员。在那台机器上,我可以看到下面使用官方网站上的测试方法工作。 但是当我使用本地消费者脚本时,它就不起作用了: 我试着把它改成: 然后运行客户端使用者脚本,它会给出错误: [2017-08-11 15:49:01,591]获取相关id为3的元数据时警告错误:{listings-incoming=leader_not_available}(org.apach

  • 我是一个使用python进行套接字编程的初学者。我正在做我的课程项目。我的项目的一部分需要用不同的端口发送和接收UDP消息。提供了名为robot的服务器程序,我需要编写名为student的客户端程序,它可以与机器人进行交互。因此,我不能显示服务器程序中的所有源代码。 这是服务器程序中与UDP套接字相关的部分 这是我的客户端程序。s3 是 UDP 套接字。我可以成功地向服务器程序发送消息,但无法从中