我正在开发一个WhatsApp的克隆,我需要在WhatsApp中实现群聊.我在Android端使用Openfire作为服务器和Asmack.现在我按照本指南实现了群聊,但这不像WhatsApp.用户不会留在房间内,并在离线后立即离开房间.在1-1 chat中没有离线消息传递的机制.所以基本上我的问题是如何使用具有以下功能的asmack实现群聊:
我需要自定义服务器端还是客户端?任何想法如何与asmack和Openfire一起完成WhatsApp组聊天将受到高度赞赏.
我可以使用XMPPFramework创建一个MUC,并使用下面的代码发送用户邀请请求加入该房间.
// Creating
AppDelegate *dele =(AppDelegate *) [[UIApplication sharedApplication]delegate];
xmppRoom = [[XMPPRoom alloc] initWithRoomStorage:dele jid:[XMPPJID jidWithString:self.roomName] dispatchQueue:dispatch_get_main_queue()];
[xmppRoom addDelegate:dele delegateQueue:dispatch_get_main_queue()];
[xmppRoom activate:dele.xmppStream];
[xmppRoom joinRoomUsingNickname:self.myNick history:nil];
// Inviting
[xmppRoom inviteUser:[XMPPJID jidWithString:@"abc@host"] withMessage:@"Come Join me"];
Run Code Online (Sandbox Code Playgroud)
用户"abc"如何知道他已收到邀请,他如何通过接受或拒绝对此做出反应?
我在XMPPFramework中找不到任何直接处理聊天室邀请的课程.我的研究表明,每当用户收到聊天室邀请时,都会调用xmmppStream的委托方法:
- (void)xmppStream:(XMPPStream *)sender didReceiveMessage:(XMPPMessage *)message
Run Code Online (Sandbox Code Playgroud)
在该消息中,我检查它是否包含名为"invite"的NSXMLElement,如果它包含,则我向用户发送回调.然后我创建聊天室,其名称与用户收到邀请的聊天室名称相同,并进入新创建的房间.它工作正常,但安静冗长,不安静有效.我想知道是否有可用XMPPFramework一类在这里它可以单独处理的聊天室邀请.例如,检测,接受和拒绝房间邀请.
我提取房间名称的代码:
- (void)xmppStream:(XMPPStream *)sender didReceiveMessage:(XMPPMessage *)message
{
NSXMLElement * x = [message elementForName:@"x" xmlns:XMPPMUCUserNamespace];
NSXMLElement * invite = [x elementForName:@"invite"];
NSXMLElement * decline = [x elementForName:@"decline"];
NSXMLElement * directInvite = [message elementForName:@"x" xmlns:@"jabber:x:conference"];
NSString *msg = [[message …
Run Code Online (Sandbox Code Playgroud) 作为一名乘员/成员,我需要通过ejabberd-14.x了解房间内的所有"成员"
我关注了http://xmpp.org/extensions/xep-0045.html#getmemberlist
我被禁止(401)跟随stanze - 需要管理员权限
<iq from='crone1@shakespeare.lit/desktop'
id='member3'
to='coven@chat.shakespeare.lit'
type='get'>
<query xmlns='http://jabber.org/protocol/muc#admin'>
<item affiliation='member'/>
</query>
</iq>
Run Code Online (Sandbox Code Playgroud)
如果我改变
<query xmlns='http://jabber.org/protocol/muc#admin'>
Run Code Online (Sandbox Code Playgroud)
从admin到用户命名空间,然后我得到状态代码501 - 功能未实现
你知道我怎样才能让一个房间的成员成为一个占有者或成员?
我不是此用例的管理员/主持人.
XEP-0045确实说:
注意:服务应该也应该将成员列表返回给仅限会员的房间中的任何占用者; 也就是说,当房间中的成员请求成员列表时,它不应该生成错误.此功能可以帮助客户显示所有现有成员,即使其中一些成员不在会议室中,例如帮助成员确定是否应邀请其他用户.服务应该允许任何成员检索成员列表,即使还不是占用者.
我在Android中实现了一个群聊机制,我通过Openfire的REST API插件创建了群组并添加了成员.将消息发送到同一组但不向同一组的所有成员发送消息.请查看我的错误日志,并建议我有任何相同的解决方案.
日志:
11-26 17:51:42.364 10035-10035/com.myoneapp.chat V/Cursor data==>>? To User ID==> onCreateLoader=>terehokerahenge
11-26 17:51:47.018 10035-10654/com.myoneapp.chat I/System.out? 05:51:47 PM SENT (0): <message to='terehokerahenge@conference.chat.spectratech.in' id='362-05' type='groupchat'><body>hi</body><SenderName></SenderName><mediaType>0</mediaType><request xmlns='urn:xmpp:receipts'/></message>
11-26 17:51:47.066 10035-10035/com.myoneapp.chat V/ChatWindow? MESSAGE TYPE==>0
11-26 17:51:47.070 10035-10035/com.myoneapp.chat V/ChatWindow? MESSAGE TYPE==>0
11-26 17:51:47.072 10035-10035/com.myoneapp.chat V/ChatWindow? MESSAGE TYPE==>0
11-26 17:51:48.097 10035-10655/com.myoneapp.chat I/System.out? 05:51:48 PM RECV (0): <message to="sanat@chat.spectratech.in/chat.spectratech.in" id="362-05" type="error" from="terehokerahenge@conference.chat.spectratech.in"><body>hi</body><SenderName/><mediaType>0</mediaType><request xmlns="urn:xmpp:receipts"/><error code="406" type="modify"><not-acceptable xmlns="urn:ietf:params:xml:ns:xmpp-stanzas"/></error></message>
11-26 17:51:48.102 10035-10654/com.myoneapp.chat I/System.out? 05:51:48 PM SENT (0): <message to='terehokerahenge@conference.chat.spectratech.in' id='CGIln-9' type='error'><received xmlns='urn:xmpp:receipts' id='362-05'/></message>
Run Code Online (Sandbox Code Playgroud)
码:
new Thread(new Runnable() {
@Override …
Run Code Online (Sandbox Code Playgroud) 我正在尝试为我们的ejabberd集群编写一个快速的负载测试脚本,只需登录聊天室,发布几条随机消息,然后退出.
我们曾尝试使用tsung进行这一特定测试,但据作者称,muc功能并没有进入这个版本.
pyxmpp似乎有这个功能,但如果我能弄清楚如何使它工作,我会变得愚蠢.这里希望有人能快速解释如何构建客户端并加入/发布到muc.
谢谢!
首先,我想提供一些背景信息:我想使用XMPP在各种客户端之间交换非结构化数据.数据源应该将其数据简单地发布到Mulit-User-Chat room(XEP-0045),以便任何感兴趣的客户端都可以注册.XMPP MUC服务可以有各种聊天室,为了找到我的数据源推送信息的那些,我想为那个房间设置一些自定义标识.我认为muc#roominfo_ <custom_ident>带有一些自定义值将是很好的完成.
出于测试目的,我编写了一个在XMPP服务上创建MUC的应用程序.认证等一切正常.我正在使用Smack与XMPP服务器通信并创建房间.当我创建房间时,我在包含我的自定义信息之前在我请求的表单字段中添加了一个字段.MUC已创建并可访问.但是当我在房间的JID上执行迪斯科#info时,不会返回创建的自定义字段.
我用(3.8.2)的本地安装测试了这个.
我只是想知道,如果这是Openfire的问题,那么在创建MUC时,或者根据XEP-0045不允许存储自定义表单字段(XEP- 0045中使用的XEP-0068)?我阅读了MUC的规范,关键是相应的部分,但是找不到任何说服我的证据,显然不可能为MUC创建这样的自定义表单字段.也许我只是误解了规范中的某些内容?有没有人尝试类似的东西,它的工作?如果是Openfire的问题,我可以尝试不同的XMPP服务器.
我可以在XMPP Asmack中实现像WhatsApp或BBM这样的群聊吗?我正在使用Openfire Server.我已经实现在XMPP(基本multiuserchat http://xmpp.org/extensions/xep-0045.html),但它没有包含所有我需要的功能.
我需要群聊的全部功能,如:
我应该自定义服务器吗?或者有关于此群组功能的标准?我真的需要帮助解决这个问题.
谢谢.
我正在开发基于Android的XMPP的聊天应用程序.
我已经完成了一对一的聊天功能,但在多用户聊天中遇到了一些问题.我已经成功创建了新的聊天室,多个用户可以加入该会议室.我也addPacketListener
为团体聊天编写了代码PacketFilter filter = new MessageTypeFilter(Message.Type.groupchat);
当用户在组中发送消息时,我也在该侦听器中接收消息,但我无法区分哪个用户已发送消息.
像一对一的聊天消息包具有message.getFrom()
检索发件人JID的功能.
在多用户聊天的情况下,相同的功能将组/房间JID作为发送者返回.
我还试图在发送设置消息的属性message.setFrom(senderJID);
或message.setFrom(sendername@conference.hostname/Groupname);
仍然我无法获得senderJID或其昵称.
所以我的问题是:如何获取发件人用户JID或其昵称?来自messageListener中的消息(数据包)
在组中发送消息的代码是: -
String to = strGroupJID;
String text = etChatOnTextBox.getText().toString();
if(!text.equals(""))
{
Message msg = new Message(to, Message.Type.groupchat);
msg.setBody(text);
String name1 = xmppConnection.getUser();
name1 = name1.substring(0, name1.lastIndexOf("@"));
name1 = name1 + "@conference.192.168.56.1";
// name1 = name1 + "@conference.192.168.56.1/" + strGroupName ;
msg.setFrom(name1);
muc.sendMessage(msg);
}
Run Code Online (Sandbox Code Playgroud)
接收消息的代码是: -
PacketFilter filter = new MessageTypeFilter(Message.Type.groupchat);
connection.addPacketListener(new PacketListener() {
@Override
public void processPacket(Packet packet) { …
Run Code Online (Sandbox Code Playgroud) 我正在尝试创建一个多用户聊天.我在加入房间时遇到错误.创建聊天室的方法:
public void createMultiUserChatRoom(String roomName, String nickName) {
// Get the MultiUserChatManager
MultiUserChatManager multiUserChatManager = MultiUserChatManager.getInstanceFor(connection);
// Get a MultiUserChat using MultiUserChatManager
MultiUserChat multiUserChat = multiUserChatManager.getMultiUserChat(roomName+"@conference.localhost");
try {
multiUserChat.create(nickName);
Form form = multiUserChat.getConfigurationForm();
Form submitForm = form.createAnswerForm();
List<FormField> formFieldList = submitForm.getFields();
for (FormField formField : formFieldList) {
if(!FormField.Type.hidden.equals(formField.getType()) && formField.getVariable() != null) {
submitForm.setDefaultAnswer(formField.getVariable());
}
}
submitForm.setAnswer("muc#roomconfig_persistentroom", true);
submitForm.setAnswer("muc#roomconfig_publicroom", true);
multiUserChat.sendConfigurationForm(submitForm);
} catch (Exception e) {
e.printStackTrace();
}
}
Run Code Online (Sandbox Code Playgroud)
加入MUC室的方法:
public void joinMultiUserChatRoom(String userName, String roomName) {
// Get the …
Run Code Online (Sandbox Code Playgroud) 首先来自这个问题: Asmack/openfire如何将用户永久保留在群聊室中
我读到我不能使用MUC来保持用户在群组中的持久性,他们会自动离开群组并且在他们再次上线后可以重新加入,这个概念就像IRC一样,在这里被问到 - > http:/ /community.igniterealtime.org/thread/48020.
然后从stackoverflow问题我读到关于使用pubsub,然后我做了一些关于pubsub的研究,我得到的是pubsub可以坚持用户在组中,即使用户离线,但消息流更像是一个从发布者到订阅者的指示(只读).
因此,如果我想创建群聊应用程序,我可以使用pubsub并将所有成员设置为发布者和订阅者吗?或者是否有其他解决方案?或者我对pubsub和MUC的理解不正确?我的目标是在whatsapp或blackberry messenger组中创建一些群聊.
谢谢.