Android - XMPP:'Already logged in to server' 异常
Android - XMPP : 'Already logged in to server' exception
我正在为我的聊天应用程序使用 aSmack 和 Openfire。
我已经编写了监听互联网连接并连接到 XMPP 服务器的后台服务。
当服务尝试连接 XMPP 服务器时,它抛出 'Already Logged in to server' 异常。
我在服务器设置中将资源策略设置为 'Always kicked' 并尝试将 'null' 作为 login() 方法中的第三个参数传递,但其中 none 对我有用.谁能帮帮我?
04-11 18:09:50.293: E/AndroidRuntime(25422): FATAL EXCEPTION: Thread-2212
04-11 18:09:50.293: E/AndroidRuntime(25422): Process: com.example.singlechat:remote, PID: 25422
04-11 18:09:50.293: E/AndroidRuntime(25422): java.lang.IllegalStateException: Already logged in to server.
04-11 18:09:50.293: E/AndroidRuntime(25422): at org.jivesoftware.smack.XMPPConnection.login(XMPPConnection.java:232)
04-11 18:09:50.293: E/AndroidRuntime(25422): at org.jivesoftware.smack.Connection.login(Connection.java:371)
04-11 18:09:50.293: E/AndroidRuntime(25422): at com.example.singlechat.BackgroundService.run(BackgroundService.java:173)
04-11 18:09:50.293: E/AndroidRuntime(25422): at java.lang.Thread.run(Thread.java:818)
连接代码:
// Connect XMPP Server
public void connectXMPPServer() {
Thread t = new Thread(new Runnable() {
@Override
public void run() {
// Create a connection
ConnectionConfiguration connConfig = new ConnectionConfiguration(
HOST, PORT, SERVICE);
connConfig.setReconnectionAllowed(true);
xmppConnection = new XMPPConnection(connConfig);
try {
xmppConnection.connect();
Log.i("XMPPChatDemoActivity", "Connected to "
+ xmppConnection.getHost());
} catch (XMPPException ex) {
Log.e("XMPPChatDemoActivity", "Failed to connect to "
+ xmppConnection.getHost());
Log.e("XMPPChatDemoActivity", ex.toString());
}
try {
if (xmppConnection.isConnected()) {
xmppConnection.login(USERNAME, PASSWORD);
Log.i("XMPPChatDemoActivity", "Logged in as "
+ xmppConnection.getUser());
Presence presence = new Presence(
Presence.Type.available);
xmppConnection.sendPacket(presence);
}
} catch (XMPPException ex) {
Log.e("XMPPChatDemoActivity", "Failed to log in as "
+ USERNAME);
Log.e("XMPPChatDemoActivity", ex.toString());
}
}
});
t.start();
}
// Broadcast receiver; listens to network state
public BroadcastReceiver networkStateReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
try {
if (isNetworkOn()) {
Log.i("BackgroundService-BroadcastReceiver",
"Network is on");
connectXMPPServer();
} else if (!isNetworkOn()) {
Log.i("BackgroundService-BroadcastReceiver",
"Network is off");
xmppConnection.disconnect();
}
} catch (Exception e) {
Log.e("BackgroundService-networkStateReceiver", e.toString());
}
}
};
// Returns network state
public boolean isNetworkOn() {
ConnectivityManager connMngr = (ConnectivityManager) getApplicationContext()
.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo netInfo = connMngr.getActiveNetworkInfo();
return (netInfo != null && netInfo.isConnected());
}
Openfire
提供了很多自定义选项,例如 Kick resources after logged out
等。但是 none 对我有用。所以 try-catch
是剩下的选项。如果有人做更好的研究,他们的建议将不胜感激。
try {
xmppConnection.login(USERNAME, PASSWORD);
} catch (IllegalStateException e) {
Log.e("MessagingService", "Already Logged in as " + xmppConnection.getUser());
}
Log.i("MessagingService", "Logged in as " + xmppConnection.getUser());
这是 Smack 库的问题 - XMPP Presence 节在启用扩展时始终发送,无论设置如何。
查看开发者主题:https://community.igniterealtime.org/thread/55778
您可以通过从 app/build.gradle 中删除 Smack 扩展依赖来验证这一点。如果您不再有异常,则意味着 Smack 开发人员应该提供解决方案。
我正在为我的聊天应用程序使用 aSmack 和 Openfire。
我已经编写了监听互联网连接并连接到 XMPP 服务器的后台服务。
当服务尝试连接 XMPP 服务器时,它抛出 'Already Logged in to server' 异常。
我在服务器设置中将资源策略设置为 'Always kicked' 并尝试将 'null' 作为 login() 方法中的第三个参数传递,但其中 none 对我有用.谁能帮帮我?
04-11 18:09:50.293: E/AndroidRuntime(25422): FATAL EXCEPTION: Thread-2212
04-11 18:09:50.293: E/AndroidRuntime(25422): Process: com.example.singlechat:remote, PID: 25422
04-11 18:09:50.293: E/AndroidRuntime(25422): java.lang.IllegalStateException: Already logged in to server.
04-11 18:09:50.293: E/AndroidRuntime(25422): at org.jivesoftware.smack.XMPPConnection.login(XMPPConnection.java:232)
04-11 18:09:50.293: E/AndroidRuntime(25422): at org.jivesoftware.smack.Connection.login(Connection.java:371)
04-11 18:09:50.293: E/AndroidRuntime(25422): at com.example.singlechat.BackgroundService.run(BackgroundService.java:173)
04-11 18:09:50.293: E/AndroidRuntime(25422): at java.lang.Thread.run(Thread.java:818)
连接代码:
// Connect XMPP Server
public void connectXMPPServer() {
Thread t = new Thread(new Runnable() {
@Override
public void run() {
// Create a connection
ConnectionConfiguration connConfig = new ConnectionConfiguration(
HOST, PORT, SERVICE);
connConfig.setReconnectionAllowed(true);
xmppConnection = new XMPPConnection(connConfig);
try {
xmppConnection.connect();
Log.i("XMPPChatDemoActivity", "Connected to "
+ xmppConnection.getHost());
} catch (XMPPException ex) {
Log.e("XMPPChatDemoActivity", "Failed to connect to "
+ xmppConnection.getHost());
Log.e("XMPPChatDemoActivity", ex.toString());
}
try {
if (xmppConnection.isConnected()) {
xmppConnection.login(USERNAME, PASSWORD);
Log.i("XMPPChatDemoActivity", "Logged in as "
+ xmppConnection.getUser());
Presence presence = new Presence(
Presence.Type.available);
xmppConnection.sendPacket(presence);
}
} catch (XMPPException ex) {
Log.e("XMPPChatDemoActivity", "Failed to log in as "
+ USERNAME);
Log.e("XMPPChatDemoActivity", ex.toString());
}
}
});
t.start();
}
// Broadcast receiver; listens to network state
public BroadcastReceiver networkStateReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
try {
if (isNetworkOn()) {
Log.i("BackgroundService-BroadcastReceiver",
"Network is on");
connectXMPPServer();
} else if (!isNetworkOn()) {
Log.i("BackgroundService-BroadcastReceiver",
"Network is off");
xmppConnection.disconnect();
}
} catch (Exception e) {
Log.e("BackgroundService-networkStateReceiver", e.toString());
}
}
};
// Returns network state
public boolean isNetworkOn() {
ConnectivityManager connMngr = (ConnectivityManager) getApplicationContext()
.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo netInfo = connMngr.getActiveNetworkInfo();
return (netInfo != null && netInfo.isConnected());
}
Openfire
提供了很多自定义选项,例如 Kick resources after logged out
等。但是 none 对我有用。所以 try-catch
是剩下的选项。如果有人做更好的研究,他们的建议将不胜感激。
try {
xmppConnection.login(USERNAME, PASSWORD);
} catch (IllegalStateException e) {
Log.e("MessagingService", "Already Logged in as " + xmppConnection.getUser());
}
Log.i("MessagingService", "Logged in as " + xmppConnection.getUser());
这是 Smack 库的问题 - XMPP Presence 节在启用扩展时始终发送,无论设置如何。
查看开发者主题:https://community.igniterealtime.org/thread/55778
您可以通过从 app/build.gradle 中删除 Smack 扩展依赖来验证这一点。如果您不再有异常,则意味着 Smack 开发人员应该提供解决方案。