2

我有一个 ejabberd 服务器,想为它写一个网络聊天客户端。我看过像 Candy 这样的东西,但它们对于我想做的事情来说有点过头了。我只想要一些基本功能,例如即时消息、群聊和在线状态。

我使用来自 strophejs-1.0.2 的 basic.html 和 basic.js 示例文件作为我的基础。我已成功连接到我的 jabber 服务器、加入会议、“尝试发送消息”、离开会议并向我发送即时消息。其中大部分是有效的。

我遇到的问题是,当用户登录并加入会议时,它会尝试向群组发布消息但失败。

<message xmlns="jabber:client" from="test@conference.jabber.example.com" to="user@jabber.example.com/27311205821380711229538600" type="error">
<body>test2</body>
<error code="406" type="modify">
<not-acceptable xmlns="urn:ietf:params:xml:ns:xmpp-stanzas"></not-acceptable>
<text xmlns="urn:ietf:params:xml:ns:xmpp-stanzas">It is not allowed to send private messages to the conference</text>
</error>
</message>

如果我使用 Pidgin 以我自己的身份登录会议,我可以看到会议中的用户。它的名称旁边有一个图标,上面有一个点和一些圆圈。如果我右键单击用户,它会说用户状态为离线。这很奇怪,因为用户在线。如果我查看 ejabberd 的管理控制台,我会看到用户在线。在用户加入会议之前,我尝试过像这样手动设置状态:

connection.send($pres({type: "Available"}));

结果:

<presence xmlns="jabber:client" from="user@jabber.example.com/27311205821380711229538600" to="user@jabber.example.com/27311205821380711229538600" type="Available"></presence>

用户仍然处于离线状态。

它在线时发送给我的 IM 在 Pidgin 中以红色文本显示。正常消息看起来是蓝色的。我认为这是因为它认为用户处于离线状态。

我有点卡住了。我想知道是否有人可以帮助我或指出我正确的方向?我首先想弄清楚为什么这个用户看起来不脱机,然后修复它。

我一直在查看有关如何查询名册的文档。我在这方面也没有取得太大的成功。我正在寻找一个非常基本的示例来显示哪些用户在线以及他们的状态,如果有更改,则通过回调进行更新。

有人能帮助我吗?

4

2 回答 2

5

要设置您的初始状态:

connection.send($pres());

要检查用户的存在,请尝试使用“probe”:

var check = $pres({type: 'probe', to: 'friend@server.com'});        
connection.send(check);

如果friend@server.com 在线,它应该返回如下内容:

<body xmlns="http://jabber.org/protocol/httpbind">
     <presence xmlns="jabber:client" from="you@server.com/4edf83f2" to="friend@server.com/4edf83f2"></presence>
</body>
于 2013-10-06T03:08:13.747 回答
0

+1 设置存在。您可以使用 ping 插件并执行 ping-pong send-response 以查看用户是否在线。也看看名册插件。至于您在 Pidgin 和 Web 客户端之间的问题,我在任何桌面客户端和显示可用的 Web 界面之间都有相同的问题,但是,我可以在两者之间聊天。

于 2013-10-30T18:22:10.177 回答