我正在玩 Smack API 和 Openfire。我发现,在 XMPP 协议中,您每次都必须打开流,登录并启用功能,这非常耗时。那么著名的按摩器应用程序 WhatsApp 是如何工作的,它是如何在如此短的时间内连接的呢?如果有人可以给我任何提示,请。我想这样做,为此我可以自定义 Openfire 和 Smack。
感谢和抱歉我的英语。
我在我的应用程序中使用smack XMPP来发送即时消息。一切都很完美,除了随机发生的崩溃
致命异常:java.lang.IllegalArgumentException:在 org.jivesoftware.smack.util.StringUtils.requireNotNullOrEmpty(StringUtils.java:468) 处,用户名不得为 null 或空 org.jivesoftware.smack.AbstractXMPPConnection.login(AbstractXMPPConnection.java:第484章第818章)
据我了解,有时它只是登录而找不到用户名。这有点奇怪,因为大多数时候它都工作得很好。
我正在使用的图书馆是
org.jivesoftware.smack
这是我用于连接的方法
public void connect()
{
Logger.writeSummaryLog(NewMyXMPP.class.getSimpleName(), "connect()", "Requesting XMPP connection", true);
if (connection != null && connection.isConnected())
{
Logger.writeSummaryLog(NewMyXMPP.class.getSimpleName(), "connect()", "XMPP already connected, returning", true);
return;
}
AsyncTask.execute(new Runnable()
{
private final int MAX_RETRIES = 3;
private int retryCount = 0;
@Override
public void run()
{
//KW: if network available but internet not available it will return
if (!initializeConnection())
{
MyApplication.updateConnectionStatus(CommonEnum.ConnectionStatus.eDisconnect);
return;
}
if (connection.isConnected())
{
MyApplication.updateConnectionStatus(CommonEnum.ConnectionStatus.eConnected); …Run Code Online (Sandbox Code Playgroud) 环境:
Ejabberd 版本:16.04
Smack-android-4.1.0
我创建了一个带有 XMPP 服务器的 Android 聊天应用程序。然而,由于谷歌播放权限问题,我不得不缩小应用程序的功能,当应用程序在后台时支持接收传入的消息通知。
作为替代方案,我从 GooglePlay 审核小组收到了以下建议。
移除此权限后,如果您的应用的消息传递需要暂时免除电池优化,您可以考虑使用 Firebase Cloud Messaging (FCM)。仅当消息时间紧迫且需要用户立即交互时才设置高优先级,并注意将消息设置为高优先级与普通优先级消息相比会导致更多电池消耗
所以目前用户可以通过应用程序发送消息。但是当他关闭应用程序时,他将被视为离线用户,并且不会收到任何来自应用程序的通知。当他再次打开应用程序时,他将获得所有保存在 Ejabberd 服务器上的离线消息。
我想增强当前的应用程序,以便即使用户关闭了应用程序,当有人向他发送消息时,他仍然会收到通知(类似于 whatsapp)
ejabberd 中是否有将服务器与 FCM 集成并处理此问题的模块?
如果我们不能通过 Ejabberd 实现这一点,是否有第三方库来支持这一点?
如果不是,我们是否必须从头开始编写一个 Erlang 模块?
我在互联网上发现了类似的问题,但找不到任何可行的解决方案。由于我对 Erlang 没有太多经验,很高兴听到您对此的解决方案/想法。提前致谢。
我正在Android上使用Smack库在XMPP客户端上工作.名册/消息/存在的东西运行得很好.但是,我没有找到存储其他个人资料信息的方法(用户图片,狗名,......).
我从谷歌搜索看到的唯一方法是使用VCards.但它根本行不通.我尝试了以下方法:
VCard vCard = new VCard();
vCard.load(connection);
vCard.setEmailHome("meine_home@email.de");
vCard.setLastName("Scheller");
vCard.setField("blafasel", "asdf");
vCard.save(connection);
Run Code Online (Sandbox Code Playgroud)
然后我一直在寻找一种方法来查看VCard信息.它既没有出现在iChat中也没出现在这个System.out中:
vCard.load(connection, user);
System.out.println(user + " has this vCard: " + vCard.toXML());
Run Code Online (Sandbox Code Playgroud)
所以出了什么问题,但没有任何迹象表明它是什么.我尝试使用google talk服务器和我自己的openfire副本,结果相同.顺便说一下,我正在使用这个版本的Smack:http://davanum.wordpress.com/2007/12/31/android-just-use-smack-api-for-xmpp/
我在这做错了什么?使用Smack存储配置文件相关信息的正确方法是什么?
我基本上是在编写一个XMPP客户端来自动回复" 特定 "的聊天消息.
我的设置是这样的:
这是我的要求:
我试图自动化我在gtalk上收到的某些消息.因此,每当我收到一条特定的消息,例如:"你好吗"时,我自己的XMPP客户端应该自动回复说"罚款".您是如何".所有发送的消息(在我的客户回复之前和之后)都发送到x@xyz.com但应该被所有客户端接收(我自己的客户端没有UI,只能响应特定的消息.).
现在我已经将我的客户端编码为自动回复.这很好用.但我面临的问题是,只要我回复(我使用smack库),发送到x@xyz.com的所有后续消息都只能由我的XMPP客户端接收.这显然是一个问题,因为我自己的客户端非常转储并且没有UI,因此我无法看到发送给我的其余消息,从而使我"丢失"消息.
我也观察到与其他XMPP客户端相同的行为.现在的问题是,这是XMPP的要求(很抱歉,我还没有很好地阅读XMPP协议).是否可以对XMPP客户端进行编码以向用户发送回复,并且仍能够在当前正在侦听消息的所有客户端中接收所有后续消息?让我的客户端成为一个完整的XMPP客户端是一个解决方案,但我不想走那条路.
我希望我的问题很明确.
我想打开一个Toast,但它似乎不能在一个侦听器(Smack)中工作,就像这个例子:
private ChatManagerListener chatManagerListener = new ChatManagerListener() {
public void chatCreated(Chat newChat, boolean createdLocally) {
if(!createdLocally) {
Toast.makeText(mCtx, "CHAT CREATED", Toast.LENGTH_SHORT).show();
// do some stuff
}
}
};
Run Code Online (Sandbox Code Playgroud)
如果我在类中的其他地方使用Toast-code,它就可以工作,只要它不是一个监听器.
我很高兴通过本地Openfire服务器在Android上实现smack,它连接到Gmail服务器主机,它就像魅力一样.教程在这里找到
但是当我尝试通过安装了本地Openfire服务器的android模拟器连接两个用户时,我收到错误(粘贴在下面).
03-23 16:24:01.392: DEBUG/SMACK(233): 04:24:01 PM SENT (1155246128): <message id="t0tgA-5" to="justestingchat2" type="chat"><body>hi</body></message>
03-23 16:24:07.032: DEBUG/SMACK(233): 04:24:07 PM RCV (1155246128): <message id="t0tgA-5" to="justestingchat@admin-pc/Smack" from="justestingchat2" type="error"><error code="404" type="cancel"><remote-server-not-found xmlns="urn:ietf:params:xml:ns:xmpp-stanzas"/></error></message>
03-23 16:24:07.062: INFO/System.out(233): Received message: null
Run Code Online (Sandbox Code Playgroud)
以下是我的一些系统级描述:
Presence presence = new Presence(Presence.Type.available);Packet Listener上面教程中提供的代码有人可以帮我解决实际上有什么问题吗?如果它可以与谷歌谈话为什么不是本地服务器?或者是因为使用模拟器?
更新1:
找出问题所在!我下载了Spark客户端并做了一些测试.我发现我能够将数据包/消息从Spark发送到Android客户端,但不能从Android发送到Spark,这给了我一个错误404!任何人还能帮我解决一些线索吗?
我在Android上有一个项目,需要使用asmack库来实现实时聊天.
关键功能是重新连接机制,这意味着我的应用程序可以在互联网连接丢失时自动重新连接.
这是我的代码片段:
ConnectionConfiguration connConfig = new ConnectionConfiguration(HOST, PORT);
connConfig.setSASLAuthenticationEnabled(true);
connConfig.setReconnectionAllowed(true);
XMPPConnection connection = new XMPPConnection(connConfig);
Run Code Online (Sandbox Code Playgroud)
但是每当我关闭然后打开Wifi时我就会收到此错误:
10-01 21:43:26.942: W/System.err(13695): javax.net.ssl.SSLException: Write error: ssl=0x5a4ad348: I/O error during system call, Broken pipe
10-01 21:43:27.002: W/System.err(13695): at org.apache.harmony.xnet.provider.jsse.NativeCrypto.SSL_write(Native Method)
10-01 21:43:27.012: W/System.err(13695): at org.apache.harmony.xnet.provider.jsse.OpenSSLSocketImpl$SSLOutputStream.write(OpenSSLSocketImpl.java:693)
10-01 21:43:27.012: W/System.err(13695): at java.io.OutputStreamWriter.flushBytes(OutputStreamWriter.java:167)
10-01 21:43:27.012: W/System.err(13695): at java.io.OutputStreamWriter.flush(OutputStreamWriter.java:158)
10-01 21:43:27.012: W/System.err(13695): at java.io.BufferedWriter.flush(BufferedWriter.java:124)
10-01 21:43:27.012: W/System.err(13695): at org.jivesoftware.smack.PacketWriter.writePackets(PacketWriter.java:210)
10-01 21:43:27.012: W/System.err(13695): at org.jivesoftware.smack.PacketWriter.access$000(PacketWriter.java:42)
10-01 21:43:27.012: W/System.err(13695): at org.jivesoftware.smack.PacketWriter$1.run(PacketWriter.java:78)
10-01 21:43:27.092: W/System.err(13695): javax.net.ssl.SSLException: Read error: ssl=0x5a4ad348: I/O …Run Code Online (Sandbox Code Playgroud) 我正在使用aSmack.我的应用程序侦听聊天室并对消息作出反应,但它从不发送消息.如果聊天室在一段时间内保持静默状态然后发送新消息,则应用程序不会收到更多消息.我研究过,我认为XEP-0199就是这里的解决方案.我看到@Flow(当前的Smack维护者)实现了它并且相关问题已经关闭.
我认为我需要使用,PingProvider但我真的不知道如何连接这个类Connection.
如何启用XEP-0199?我该怎么用PingProvider?
连接代码:
smack = SmackAndroid.init(getActivity().getApplicationContext());
connection = new XMPPConnection(App.getServer());
connection.addConnectionListener(new ConnectionListener() {
private final static String SMACK = "SMACK";
@Override
public void reconnectionSuccessful() {
Log.i(SMACK , "reconnectionSuccessful");
}
@Override
public void reconnectionFailed(Exception e) {
Log.i(SMACK, "reconnectionFailed", e);
}
@Override
public void reconnectingIn(int seconds) {
Log.i(SMACK, "reconnectingIn " + seconds);
}
@Override
public void connectionClosedOnError(Exception e) {
Log.i(SMACK, "connectionClosedOnError", e);
}
@Override
public void connectionClosed() …Run Code Online (Sandbox Code Playgroud) 我一直在使用smack 3.4作为我的门户网站.也使用asmack 3.4为我的Android应用程序(aSmack开发停止了几年,但在那里我使用了一些非官方的罐子.面对文件上传和群聊的问题,所以它想要升级到官方smack,因为它现在已经和原生支持).
但是现在有一个关于smack的更新他们已经转移到4.1(android native integrated):
https://github.com/igniterealtime/Smack/wiki/Smack-4.1-Readme-and-Upgrade-Guide.
所以我正在寻找一些代码示例/示例项目/代码片段,其中SMACK 4.1 alpha与android/web集成.请提供一些有用的链接.
关于做/不进行此升级的建议.因为smack 4.1仍未发布.
谢谢.