Blackberry 使用XMPP服务器的聊天应用程序

Blackberry 使用XMPP服务器的聊天应用程序,blackberry,java-me,xmpp,Blackberry,Java Me,Xmpp,我正在使用XMPP服务器制作一个聊天应用程序。聊天应用程序工作得很好,但我有一个问题:当两个用户聊天时,我无法知道第一个用户的消息是否已到达服务器 因此,如何知道来自第一个用户的消息是否到达服务器,而不必担心第二个用户在线或离线 请帮忙 我发出的信息如下: final SecureConnection sc = (SecureConnection)Connector.open("ssl://...", Connector.READ_WRITE); is = sc.openInputStream(

我正在使用XMPP服务器制作一个聊天应用程序。聊天应用程序工作得很好,但我有一个问题:当两个用户聊天时,我无法知道第一个用户的消息是否已到达服务器

因此,如何知道来自第一个用户的消息是否到达服务器,而不必担心第二个用户在线或离线

请帮忙

我发出的信息如下:

final SecureConnection sc = (SecureConnection)Connector.open("ssl://...", Connector.READ_WRITE);
is = sc.openInputStream();
os = sc.openOutputStream();
this.reader = new XmlReader(is);
this.writer = new XmlWriter(os);

public boolean sendMessage(final String to, final String msg) {
this.writer.startTag("message"); 
this.writer.attribute("type", "chat"); 
this.writer.attribute("to", to); 
this.writer.startTag("body"); 
this.writer.text(msg); 
this.writer.endTag(); 
this.writer.endTag(); 
this.writer.flush();
}

您需要在代码中实现ACK/NACK通知

如果您连接到服务器并发送了消息,您可以确信消息已到达服务器。如果客户端位于不可靠的网络上,有时TCP连接会悄无声息地中断,并且需要一段时间才能检测到这种情况并将其关闭。可能的解决方案(按复杂性顺序):

  • 使用定期Ping服务器
  • 实施。终极可靠性,但更难实现,需要服务器支持
您似乎担心的另一个问题是用户2看到消息。我不知道您的应用程序,它是如何配置的,或者您希望它如何工作。但是,大多数XMPP服务器将在用户脱机时自动存储发送给用户的消息。然后,当它们联机时,会将它们交付给用户。有关更多信息,请参阅


最后,您可以使用消息收据来了解user2何时接收/读取消息。这些都在中进行了描述,如果您关心的只是知道user2收到了消息,那么这可能是您真正需要实现的唯一事情。

感谢您的回复,如何在我的代码中实现ACK/NACK?我读到这应该是在描述,但如何?顺便说一句,您的意思是客户端代码对吗?当您向服务器发送任何消息时,如果从客户端到服务器连续收到消息,服务器应响应“1”。所以这个“1”是客户端的ACK。如果客户机在特定时间内没有收到“1”,那么您的客户机应该重新发送消息,因为服务器没有响应任何内容,这就是我问这个问题的原因。有关更多信息,我正在使用openfire server,您确定此信息吗?因为我对它进行了数百次测试,但服务器没有回复。好的,告诉我您是如何向服务器发送代码的?我100%确信,每当服务器收到消息时,它必须返回代码,至少您必须得到200作为响应代码,哪种类型的ACK适合您。没有像200这样的响应,因为我们只是使用writer.flush方法,即使没有internet连接,它有时也不会返回异常。这种方法中的writer是什么?当然,将数据写入XMPP服务器是xml writer我知道,我想知道的是,它是哪个类的对象/变量?好的,你可以使用HttpConnection。或者只需检查您的SecureConnection是否有任何类似getResponseCode()的方法?嘿,MattJ,您所说的都已经实现了。我不担心第二个用户。我只想知道我发送的消息何时到达服务器。如何让服务器回复发件人消息已到达?谢谢如果你说我说的一切都已经实现了,那么你就有了XEP-0198,这已经给了你这些信息。只需在发送消息后发送,服务器将在收到消息后响应。