我正在为Android和iPhone工作一个XMPP客户端。我已经能够连接到服务器并获取消息。
但客户端在几分钟后与XMPP服务器断开连接。 IOS XMPP框架由委托方法组成,该方法指示客户端是否连接到服务器。如果连接未断开,那么我们可以使用委托方法重新连接。我在Android客户端(我正在使用aSmack库)中使用以下代码来检查是否存在连接。但这似乎无效。
public void recieveMessage()
{
Log.e("xmppclient","will receive messages");
PacketFilter filter = new MessageTypeFilter(Message.Type.chat);
connection.addPacketListener(new PacketListener() {
public void processPacket(Packet packet) {
if(connection != null && connection.isConnected())
{
Message message = (Message) packet;
if (message.getBody() != null)
{
fromName = StringUtils.parseBareAddress(message.getFrom());
String messageBody=message.getBody();
Log.e("Message", messageBody );
Intent i = new Intent(NEW_MESSAGE);
i.putExtra("username", StringUtils.parseBareAddress(message.getFrom()));
i.putExtra("message", message.getBody());
sendBroadcast(i);
}
else
{
connectToXmpp();
}
}
}
}
,filter);
}
connectToXMPP()是打开新连接的方法。
有没有其他方法可以检查连接并在连接消失后立即重新连接到XMPP ...... ???
答案 0 :(得分:5)
如上所述,您需要附加连接侦听器,如下所示:
Connection connection = (Connection)params[0];
connection.connect();
connection.addPacketListener(new PacketListener() {
@Override
public void processPacket(Packet packet) {
System.out.println("Received message");
}
}, new PacketFilter() {
@Override
public boolean accept(Packet packet) {
System.out.println("Received message");
return true;
}
});
connection.addConnectionListener(new ConnectionListener() {
@Override
public void connectionClosed() {
System.out.println("uhoh");
}
@Override
public void connectionClosedOnError(Exception e) {
System.out.println("uhoh");
}
@Override
public void reconnectingIn(int i) {
if(i < 4){
//TODO notify
}
}
@Override
public void reconnectionSuccessful() {
System.out.println("uhoh");
}
@Override
public void reconnectionFailed(Exception e) {
System.out.println("uhoh");
}
});
connection.login("test2", "test");
答案 1 :(得分:2)
您应该可以通过在连接上使用ConnectionListener来完成此操作。这将允许您检测何时断开连接并尝试正确处理它。
列出的代码几乎不会碰到其他条件,因为连接必须一直打开才能接收您正在处理的数据包。
答案 2 :(得分:2)
我自己也遇到过这个问题,现在我已经解决了我的问题而且工作正常。
以下是解决方案: -
您的问题将得到解决。
答案 3 :(得分:0)
确保在重新连接时始终检查conflict错误。当另一个客户端使用与当前会话相同的完整JID(本地@域/资源)登录时,会发生这种情况。你会得到这个:
<stream:error>
<conflict xmlns='urn:ietf:params:xml:ns:xmpp-streams'/>
</stream:error>
从不自动重新连接,如果这是错误,或者您将编写可怕的“决斗资源”错误。再次。像所有其他XMPP客户作者一样。