Django + Strophe + ejabberd - 附加和群聊的麻烦

Posted

技术标签:

【中文标题】Django + Strophe + ejabberd - 附加和群聊的麻烦【英文标题】:Django + Strophe + ejabberd - troubles with attach and groupchat 【发布时间】:2013-04-18 09:24:36 【问题描述】:

我尝试使用 strophe + ejabberd 来制作类似网络聊天的东西。

我已经做了什么:

当我登录网站时,我还向 ejabberd 进行身份验证(以实现 RID 和 SID), 登录完成后,我附加从上下文处理器获得的 RID 和 SID, 连接状态似乎是:连接建立,日志:

.

POST: <body rid='406266360' xmlns='http://jabber.org/protocol/httpbind' sid='9c66aa19123e96dc2925c24d4f985d458763eb67'><presence xmlns='jabber:client'><priority>-1</priority></presence><presence to='localhost/m' xmlns='jabber:client'><x xmlns='http://jabber.org/protocol/muc'/></presence></body>

RESP: <body xmlns='http://jabber.org/protocol/httpbind'><success xmlns='urn:ietf:params:xml:ns:xmpp-sasl'/></body>

之后,连接挂起:

POST: <body rid='406266361' xmlns='http://jabber.org/protocol/httpbind' sid='9c66aa19123e96dc2925c24d4f985d458763eb67'/>

当我现在尝试发送消息时(当它被挂起时):

POST: <body rid='406266362' xmlns='http://jabber.org/protocol/httpbind' sid='175e45333109f74c36f9dffbe4e3cc6cffc80df4'><message to='localhost' type='groupchat' xmlns='jabber:client'><body>yrdy</body></message></body>

我得到:

RESP: <body type='terminate' condition='remote-stream-error' xmlns='http://jabber.org/protocol/httpbind' xmlns:stream='http://etherx.jabber.org/streams'><stream:error><xml-not-well-formed xmlns='urn:ietf:params:xml:ns:xmpp-streams'/></stream:error></body>

怎么了?奇怪的是,几秒钟后请求被中止,下一个请求再次挂起。当我尝试发送消息时,没有错误,但响应是:

RESP: <body xmlns='http://jabber.org/protocol/httpbind'/>

没有错误(连接仍然连接并经过身份验证,但似乎没有传递消息)。

我用来发送消息的代码:

var body = $('#input_text').val();                                                            |        // make sure this presence is for the right room
var msg_body =                                                                               |        if (room === Groupie.room) 
    to: Chat.room,                                                                       |            var nick = Strophe.getResourceFromJid(from);
    type: 'groupchat'                                                                         |
                                                                                             |            if ($(presence).attr('type') === 'error' &&
var msg = $msg(msg_body).c('body').t(body);                                                   |                !Groupie.joined) 
                                                                                              |                // error joining room; reset app
Chat.connection.send(msg);

【问题讨论】:

【参考方案1】:

您可以使用 Strophe.js 像这样附加:

Chat.connection = new Strophe.Connection(Chat.BOSH_SERVICE_URL);
Chat.connection.attach(jid, sid, rid, onConnectHandler);

onConnectHandler 一旦你连接成功就会被调用。从那时起,您不必再担心 SID 和 RID(直到重新加载页面)。

另外,你知道MUC strophe plugin吗?

如果你想使用/学习一些示例代码,我写了一些类似于你为Plone 做的东西,称为collective.xmpp.chat

javascript 可单独重复使用:converse.js

【讨论】:

由 Strophe 完成。我已经完全按照你一开始的建议做了,之后一切都由 Strophe 处理(我的意思是 RID 增加)。但我认为 RID 是正确的。我在调试模式下运行我的 ejabberd,我看到服务器正在正确获取消息(在第一次挂起中止之后,而不是之前)。尽管如此,我的公共消息处理程序没有被强制转换(也没有其他)。所以目前的诊断是:Strophe 正在发送消息(有挂起连接的小问题),Strophe 没有收到消息。谢谢你的链接。我去看看。 啊,我明白你的意思了。它只是一个副本,这就是 RID 不同的原因。

以上是关于Django + Strophe + ejabberd - 附加和群聊的麻烦的主要内容,如果未能解决你的问题,请参考以下文章

ejabber 的 erl 文件在 mac os 10.7.5 上运行时给出错误“分段错误:11”

如何在 Ejabbered 中为 MUC 创建一个持久组?

无法打开 ejabbered Web 仪表板 localhost:5280

通过 Mule ESB CE 连接 Ejabbered

使用f***g php注销ejabbered用户

aSmack 4.0.* XMPPTCPConnection 无法连接到 OpenFire 和 Ejabbered (SmackException$NoResponseException)