我是 XMPP 协议的新手,我正在使用 smack 库在 android 中开发一个聊天应用程序。我一直在创建群聊。我想创建一个群组,向其中添加成员并向群组的所有成员(如 WhatsApp 群组)发送消息。在搜索群聊时,我得到了两件事
createGroup(String name)存在的方法创建组Roster。MultiUserChatManager.我对什么是组以及什么是多用户聊天感到困惑?谁能解释一下它们之间的基本区别,我应该使用哪一个,以及如何向群组中的每个人发送消息?
我正在尝试使用smack客户端4.1.2创建用户.我收到了以下错误.
Send XML on stream = <<"<iq from='abc.example.com' to='admin@abc.example.com/Smack' id='Dym8b-14' type='error'><query xmlns=jabber:iq:register><password>xxxxxx</password><username>user</username><registered/></query><error code=403 type=auth><forbidden xmlns=urn:ietf:params:xml:ns:xmpp-stanzas/></error></iq>">>
Run Code Online (Sandbox Code Playgroud)
我的ejabberd配置如下(.yml文件)
register_from:
admin: allow
...
access_from: register_from
access: register
Run Code Online (Sandbox Code Playgroud)
我仍然遇到上述错误.请帮忙
添加代码段以显示如何使用smack 4.1.0创建新用户
connection = new XMPPTCPConnection(getConnectionConfiguration());
connection.connect();
connection.login("admin", "admin");
if(connection.isAuthenticated())
{
AccountManager accountManager = AccountManager.getInstance(connection);
accountManager.sensitiveOperationOverInsecureConnection(true);
accountManager.createAccount(userName, password);
connection.disconnect();
// The account has been created, so we can now login
connection.login(userName, password);
}
private XMPPTCPConnectionConfiguration getConnectionConfiguration()
{
XMPPTCPConnectionConfiguration config = XMPPTCPConnectionConfiguration.builder()
.setServiceName("abc.example.com")
.setHost("abc.example.com")
.setPort(5222)
.build();
return config;
}
Run Code Online (Sandbox Code Playgroud) 我们使用 ejabberd 的 Pub/Sub 机制在多个客户端之间发送消息。服务器上运行的ejabberd版本是16.04,smack库版本是4.1.1。
消息的发布和订阅在一段时间内工作正常,一段时间后我们在客户端收到以下异常:
org.jivesoftware.smack.SmackException$NoResponseException: No response received within reply timeout. Timeout was 15000ms (~15s). Used filter: IQReplyFilter: iqAndIdFilter (AndFilter: (OrFilter: (IQTypeFilter: type=error, IQTypeFilter: type=result), StanzaIdFilter: id=T89NL-174)), : fromFilter (OrFilter: (FromMatchesFilter (full): pubsub.unio.com))
Run Code Online (Sandbox Code Playgroud)
尝试谷歌搜索原因,但无法找到解决方案。任何帮助表示赞赏。
提前致谢。
我一直在使用 smack 客户端库 4.1.8 和 xmpp 服务器(openfire 服务器)开发聊天应用程序,但是在尝试使用 Accountmanger 类创建新用户时,它引发了异常“XMPPError: bad-request - modify”
XMPPTCPConnectionConfiguration conf = XMPPTCPConnectionConfiguration.builder()
.setSecurityMode(ConnectionConfiguration.SecurityMode.disabled)
.setHost("127.0.0.1")
.setDebuggerEnabled(true)
.setPort(5222)
.setSendPresence(true)
.setServiceName("127.0.0.1")
.build();
AbstractXMPPConnection conn2 = new XMPPTCPConnection(conf);
//conn2.login();
conn2.connect();
AccountManager accountManager = AccountManager.getInstance(conn2);
if (accountManager.supportsAccountCreation()) {
accountManager.sensitiveOperationOverInsecureConnection(true);
accountManager.createAccount("qidus", "123456");
conn2.login("qidus", "123456");
}
} catch (SmackException | IOException | XMPPException e) {
e.printStackTrace();
}
Run Code Online (Sandbox Code Playgroud)
例外是这个
04:01:41 AM SENT (0): <iq to='127.0.0.1' id='aYej1-3' type='get'><query xmlns='jabber:iq:register'></query></iq>
Run Code Online (Sandbox Code Playgroud)
04:01:41 AM RECV (0):
org.jivesoftware.smack.XMPPException$XMPPErrorException: XMPPError: bad-request - modify
at org.jivesoftware.smack.XMPPException$XMPPErrorException.ifHasErrorThenThrow(XMPPException.java:135)
at org.jivesoftware.smack.PacketCollector.nextResultOrThrow(PacketCollector.java:232)
at org.jivesoftware.smack.PacketCollector.nextResultOrThrow(PacketCollector.java:213) …Run Code Online (Sandbox Code Playgroud) 我正在使用smack和openfire在android中创建聊天应用程序.对于消息状态我在其他客户端中传递和显示消息没有问题(仔细检查).我将发送一个简单的json消息,如bellow给发送者:{"delivery":timestapmp}并解析它并仔细检查低于之前发送的时间戳的消息.问题是关于发送状态(一次检查).当我发送消息时,服务器没有响应消息发送的任何内容.是否有可能在smack中发送带有来自服务器回调的消息.如果可能的话,是否可以在回调响应中发送时间服务器.谢谢 .
我一直在寻找很多.但找不到任何东西.我需要用rosterlistener刷新联系人的状态.(离线/在线).创建名单时,我做:
Presence presence = roster.getPresence(r.getUser());
if(presence.isAvailable()){
userstatus.add("online");
}else{
userstatus.add("offline");
}
Run Code Online (Sandbox Code Playgroud)
userstatus是一个矢量字符串,然后我从中创建一个字符串数组.在我的主程序中,我只是检查这个搅拌阵列的离线或在线.但是,如果用户离线/在线,该怎么办.究竟我必须把听众以及如何使用它?
我正在为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);
}
Run Code Online (Sandbox Code Playgroud)
connectToXMPP()是打开新连接的方法.
一旦连接消失,有没有其他方法来检查连接并重新连接到XMPP ...... ???
我正在尝试使用最新版本的Smack(3.2.1)编写一个简单的示例来在两个帐户之间发送和接收消息.
Connection connection = new XMPPConnection("jabber.org");
connection.connect();
connection.login("username", "password");
Run Code Online (Sandbox Code Playgroud)
但我甚至无法通过登录部分.当我运行上面的代码时,我得到了这个异常:
Exception in thread "main" SASL authentication DIGEST-MD5 failed: invalid-authzid:
at org.jivesoftware.smack.SASLAuthentication.authenticate(SASLAuthentication.java:337)
at org.jivesoftware.smack.XMPPConnection.login(XMPPConnection.java:203)
at org.jivesoftware.smack.Connection.login(Connection.java:348)
at com.smack.TestSmack.main(TestSmack.java:19)
Run Code Online (Sandbox Code Playgroud)
这里发生了什么?我确信我的用户名和密码有效,因为我可以使用我的IM客户端登录.
有人能指出我目前正在研究Smack的例子吗?这非常令人沮丧,因为文档和库似乎不同步.
谢谢-
我正在将我的android应用程序从asmack-android库移动到Smack 4.1.4.我在Smack的asmack版本中有一些PacketExtensions,它使用PacketExtension和PacketExtensionProvider类来处理.由于在Smack 4.1.4中不推荐使用PacketExtension,因此我对类和接口ExtensionElement,DataPacketExtension,ExtensionElementProvider,DefaultExtensionElement感到困惑.你们中的任何人都可以给我一个创建扩展的例子,可以添加节和解析... https://www.igniterealtime.org/builds/smack/docs/latest/javadoc/org/jivesoftware/smack /packet/DefaultExtensionElement.htmlhttps://www.igniterealtime.org/builds/smack/docs/latest/javadoc/org/jivesoftware /smack/provider/ExtensionElementProvider.html
我正在使用Smack XMPP作为Android应用程序,之前每件事情都非常顺利,除了今天早上它开始无缘无故崩溃.这是我在Gradle中所包含的内容:
compile 'org.igniterealtime.smack:smack-android:4.2.0'
compile 'org.igniterealtime.smack:smack-tcp:4.2.0'
compile 'org.igniterealtime.smack:smack-android-extensions:4.2.0'
Run Code Online (Sandbox Code Playgroud)
并且日志正在打印此错误
位于de.measite.minidns.dnssec.DNSSECClient的de.measite.minidns.DNSName.from(DNSName.java:287)的java.lang.ExceptionInInitializerError.(DNSSECClient.java:48)de.measite.minidns.hla.DnssecResolverApi .(DnssecResolverApi.java:47)at.measite.minidns.hla.DnssecResolverApi.(DnssecResolverApi.java:38)at orme.jivesoftware.smack的de.measite.minidns.hla.DnssecResolverApi.(DnssecResolverApi.java:31) .util.dns.minidns.MiniDnsResolver.(MiniDnsResolver.java:54)位于org.jivesoftware.smack的java.lang.Class.forName(Class.java:324)的java.lang.Class.classForName(Native Method). SmackInitialization.loadSmackClass(SmackInitialization.java:218)private static final DNSName DEFAULT_DLV = DNSName.from("dlv.isc.org");
在这条线上
XMPPTCPConnectionConfiguration.Builder config = XMPPTCPConnectionConfiguration
.builder();
Run Code Online (Sandbox Code Playgroud)
我搜索了很多但找不到任何东西.
谢谢