在切换数据连接时,Android上的XMPP消息丢失(例如,转动Wifi,GSM < - > Wifi切换)

Alp*_*pan 15 android xmpp smack asmack

我正在android中开发一个聊天应用程序.使用XMPP服务器.PHP服务器已迁移到ejabber.

我的通知在所有情况下都能正常运行 但在一个案例中,我正在丢失XMPP消息.事实上我没有收到通知.

详细说来,我正在关闭WiFi或数据连接.关闭WiFi或数据连接后,发送给我的任何通知都没有收到.在我打开WiFi或数据连接后,我无法收到发送给我的消息.

我已经在后台实施了服务.这使得xmpp连接永远存在.

我关闭WiFi连接时收到此错误.

java.net.SocketException: sendto failed: EPIPE (Broken pipe)
java.net.SocketException: recvfrom failed: ETIMEDOUT (Connection timed out)
   at libcore.io.IoBridge.maybeThrowAfterSendto(IoBridge.java:506)
   at libcore.io.IoBridge.sendto(IoBridge.java:475)
   at java.net.PlainSocketImpl.write(PlainSocketImpl.java:508)
   at java.net.PlainSocketImpl.access$100(PlainSocketImpl.java:46)
   at java.net.PlainSocketImpl$PlainSocketOutputStream.write(PlainSocketImpl.java:270)
   at java.io.OutputStreamWriter.flushBytes(OutputStreamWriter.java:167)
   at java.io.OutputStreamWriter.flush(OutputStreamWriter.java:158)
   at java.io.BufferedWriter.flush(BufferedWriter.java:124)
   at org.jivesoftware.smack.PacketWriter.writePackets(PacketWriter.java:286)
   at org.jivesoftware.smack.PacketWriter.access$12(PacketWriter.java:270)
   at org.jivesoftware.smack.PacketWriter$1.run(PacketWriter.java:137)
Caused by: libcore.io.ErrnoException: sendto failed: EPIPE (Broken pipe)
   at libcore.io.Posix.sendtoBytes(Native Method)
   at libcore.io.Posix.sendto(Posix.java:146)
   at libcore.io.BlockGuardOs.sendto(BlockGuardOs.java:177)
   at libcore.io.IoBridge.sendto(IoBridge.java:473)
   ... 9 more
   at libcore.io.IoBridge.maybeThrowAfterRecvfrom(IoBridge.java:552)
   at libcore.io.IoBridge.recvfrom(IoBridge.java:516)
   at java.net.PlainSocketImpl.read(PlainSocketImpl.java:489)
   at java.net.PlainSocketImpl.access$000(PlainSocketImpl.java:46)
   at java.net.PlainSocketImpl$PlainSocketInputStream.read(PlainSocketImpl.java:241)
   at java.io.InputStreamReader.read(InputStreamReader.java:244)
   at java.io.BufferedReader.read(BufferedReader.java:310)
   at org.jivesoftware.smack.XMPPConnection$AliveReader.read(XMPPConnection.java:1122)
   at org.kxml2.io.KXmlParser.fillBuffer(KXmlParser.java:1496)
   at org.kxml2.io.KXmlParser.peekType(KXmlParser.java:979)
   at org.kxml2.io.KXmlParser.next(KXmlParser.java:346)
   at org.kxml2.io.KXmlParser.next(KXmlParser.java:310)
   at org.jivesoftware.smack.PacketReader.parsePackets(PacketReader.java:321)
   at org.jivesoftware.smack.PacketReader.access$1(PacketReader.java:216)
   at org.jivesoftware.smack.PacketReader$1.run(PacketReader.java:70)
Caused by: libcore.io.ErrnoException: recvfrom failed: ETIMEDOUT (Connection timed out)
   at libcore.io.Posix.recvfromBytes(Native Method)
   at libcore.io.Posix.recvfrom(Posix.java:131)
   at libcore.io.BlockGuardOs.recvfrom(BlockGuardOs.java:164)
   at libcore.io.IoBridge.recvfrom(IoBridge.java:513)
   ... 13 more
Run Code Online (Sandbox Code Playgroud)

小智 4

因此,要安装 mod_archive,我需要执行此操作,典型的操作是:\n在 cmd 中写入以下行。(对于分 Os)

\n\n

以 root 身份登录\n创建新目录:

\n\n
mkdir ejabberd_archive_plugin\ncd ejabberd_archive_plugin\n
Run Code Online (Sandbox Code Playgroud)\n\n

现在使用以下命令获取最新的 ejabberd 模块

\n\n
yum https://svn.process-one.net/ejabberd-modules\ncd ejabberd-modules/mod_archive/trunk\n./build.sh\n
Run Code Online (Sandbox Code Playgroud)\n\n

现在使用以下 cmd 进入 ebin 目录并获取 ejabberd 存档插件的所有 *.beam 文件的列表。

\n\n
root@ns1 [/ejabberd_archive_plugin/ejabberd-modules/mod_archive/trunk/ebin]# ls \xe2\x80\x93l\n
Run Code Online (Sandbox Code Playgroud)\n\n

使用以下 cmd,您将在 ejabberd 设置和配置时获得所有 ejabberd *.beam 文件列表。

\n\n
root@ns1 [/usr/lib64/ejabberd/ebin]# ls -l\n
Run Code Online (Sandbox Code Playgroud)\n\n

现在使用以下 cmd 将所有 *.beam(存档插件)文件复制到 ejabberd ebin 目录

\n\n
root@ns1 [/]# cp /ejabberd_archive_plugin/ejabberd-modules/mod_archive/trunk/ebin   /usr/lib64/ejabberd/ebin\n
Run Code Online (Sandbox Code Playgroud)\n\n

现在转到以下 URL 并复制所有 sql 表查询并在 phpmyadmin(ejabberd 数据库)中运行

\n\n
https://svn.process-one.net/ejabberd-modules/mod_archive/trunk/src/mod_archive_odbc_mysql.sql\n
Run Code Online (Sandbox Code Playgroud)\n\n

现在使用以下 cmd 配置 ejjaberd.cfg

\n\n
root@ns1 [/etc/ejabberd]# vi ejabberd.cfg \nAdd the following line into ejabberd.cfg file in modules configuration section\n{mod_archive_odbc, [{database_type, "mysql"}, {default_auto_save, true}, {enforce_default_auto_save, true}]},\n
Run Code Online (Sandbox Code Playgroud)\n\n

现在重新启动 ejabberd 服务。

\n\n
root@ns1 [/etc/ejabberd]# sudo service ejabberd restart\n
Run Code Online (Sandbox Code Playgroud)\n