4

我不确定我所做的是否绝对正确。但这里有:

  1. 用户通过基于 Web 的界面登录聊天
  2. 通过 Comet 通知用户更新
  3. 用户输入转到 PHP 文件的详细信息,该文件进一步连接到 Jabber 服务器

现在的问题是,当用户想要发送消息时,很简单,运行 php,我在其中连接到 jabber 服务器并发送消息。当我在等待消息时,问题就出现了。因为如果我登录并检查消息并断开连接,在其他用户端我将显示为断开连接。

我是否以错误的方式处理这个问题?我应该直接连接到 Jabber 服务器(通过 javascript)而不是中间的 PHP 层吗?如何通过 PHP 接收消息?

4

3 回答 3

1

我还没有尝试过,但你可能想看看xmpphp。其次,您可能需要考虑让用户登录到 XMPP 服务器(也称为 Jabber 服务器),只要他们登录到您的网站。您可能希望有某种超时,以防他们离开您的网站并且不再回来。

至于你是否应该通过 JavaScript 连接,我不明白你为什么不能。我建议你选择对你来说最简单的东西。对于这种情况,您可能想查看Strophe,我听到了一些关于它的好消息。

我广泛使用的唯一 XMPP 库是headstock,但这需要使用pythonKamaelia

于 2009-05-11T12:41:01.437 回答
0

这是 http 的一个固有问题(或功能) - 没有持久的连接(不是真的)。你需要一个解决方法,没有真正的解决方案。

你可以用 java 或 flash 来做,但这不是很好(javascript 4tw!)。

另一种可能性是创建一个中间客户端,它将浏览器和 web 服务器之间的连接转换为 web 服务器和 jabber 服务器之间的连接。混乱,但可能。

或者也许有一个 API 可以帮助解决这个问题。

通过javascript直接连接到jabber服务器
我可能睡过最新的ajax发明,但是afaik你只能与source-html文件来自的主机通信(忽略greasmonkey和插件)。没有不同的域,没有不同的端口,时期。除非您要教您的 jabber 服务器如何将您的 chatpage-html 提供给浏览器,否则这将产生问题。此外,保持联系甚至不起作用,因为这需要多部分响应。这些仅由 Mozilla 支持,这就是为什么丑小鸭 COMET 甚至首先存在的原因。comet 本身是一种解决方法,可以避免在传输数据时无法保持连接。

于 2009-05-11T12:45:37.837 回答
0

因此,据我所知,问题在于,当另一端的 Jabber 用户响应时。那里的问题,至少部分是,用户正在响应 Jabber 服务器上的另一个用户,但是您希望 php 脚本知道该响应已经发生而没有保持连接打开(这是有道理的,因为脚本可能不再运行)。

一种选择,虽然是一个非常愚蠢的选择,是:

  • 有一个 php 脚本可以代理到 Jabber 服务器的连接,以便为您页面上的用户发送和接收,

  • 使用 AJAX 为用户发送消息(AJAX 将指向上述脚本,脚本将发送消息。)

  • 有一个 Javascript 无限循环,每 10 秒左右 ping 一次相同的脚本,检查是否有消息。如果有,它们将被传递回客户端并输出给用户。

以上只有两个问题:

1)如果消息传输时用户未连接,php脚本是否仍会看到/获取消息?

2) 每 3 秒发出一次 ajax 请求的客户端循环可能是一个巨大的消耗。

解决方案2:

OpenFire Jabber 服务器。它带有一个内置的网络聊天客户端,它有一个名为 Fastpath 的插件,用于在客户端处理基于 HTML 的聊天(就像“现在与代理聊天!”在太多支持页面上的功能。)

我们在工作中使用它,它是非常可定制的,可以与其他脚本集成(例如,如果你想要一个脚本来从他们的登录中填充用户详细信息,或者添加一些自定义头像,或者其他什么),它(OpenFire ) 有大量其他扩展和插件,如果这不是你想要的,它们可能有你正在寻找的东西。

于 2009-07-15T10:30:04.947 回答