我已经安装并配置了 Prosody 服务器。它监听标准的 localhost:5222。在配置文件中添加了管理员 - [email protected]。对服务器的每个请求都以错误告终:

<stream:stream xmlns:stream="http://etherx.jabber.org/streams" xmlns="jabber:client" id="" version="1.0">
    <stream:error>
        <not-well-formed xmlns="urn:ietf:params:xml:ns:xmpp-streams"/>
    </stream:error>
</stream:stream>

作为客户,我想使用 strophe.js。我只发送存在节 ($pres)。这是我的代码。
'use strict';

angular.module('xmppTestApp')
    .controller('ChatCtrl', function () {

    var vm = this;

    var url = "http://localhost:5222";
    var connection = null;

    var output = document.getElementById("output");

    function log(message) {
        var line = document.createElement("div");
        line.textContent = message;
        output.appendChild(line);
    }

    function connectHandler(cond) {
        if (cond == Strophe.Status.CONNECTED) {
            log("connected");
            connection.send($pres());
        }
        else {
            log("not connected");
        }
    }

    vm.connectB = function() {
        var username = document.getElementById("username").value;
        var password = document.getElementById("password").value;

        console.info(url);
        console.info(username);
        console.info(password);

        connection = new Strophe.Connection(url);
        connection.connect(username, password, connectHandler);
    }
});

在控制台中,我看到错误:
XMLHttpRequest cannot load http://localhost:5222/. No 'Access-Control-Allow-Origin' header is present on the requested resource.
Origin 'http://localhost:9000' is therefore not allowed access.

如何将 Access-Control-Allow-Origin' header 添加到我的请求中?

当我尝试向 localhost:5222(不带 http)发送请求时,我得到:
XMLHttpRequest cannot load localhost:5222. Cross origin requests are only supported for HTTP.

当我通过 websocket 发送它时,我得到:
WebSocket connection to 'ws://localhost:5222/' failed: Error during WebSocket handshake: Unexpected response code: 200

Fiddler 向我提供协议(protocol)违规报告:
The server didn't return properly-formatted HTTP Headers. Maybe missing altogether
(e.g. HTTP/0.9), maybe only \r\r instead of \r\n\r\n?

最佳答案

首先,看起来您正在尝试直接连接到端口 5222(通常用于 XMPP),但是为了从客户端网页使用 Strophe,您必须使用 HTTP-Binding(又名 BOSH)。

XMPP 与 BOSH

Strophe 使用 XMPP,但它的独特之处在于它实际上并不使用 XMPP 协议(protocol)传输数据,而是依赖 BOSH(即,基于同步 HTTP 的双向流)。这是因为 XMPP 协议(protocol)旨在让客户端和服务器始终保持连接,我们都知道 HTTP 不是这样工作的。简而言之,BOSH 允许您的 HTTP 客户端异步接收数据,而无需明确地发出请求。如果您有更多关于 BOSH 的问题,请告诉我,我会尽力解释它的作用以及您为什么需要它。

在连接 Strophe 之前,您必须在 prosody 中启用此功能,请查看此链接以进行设置。

Prosody Docs - Setting up BOSH

设置 BOSH 后,您需要更改客户端代码以使用不同的地址。您可能已将 BOSH 的路径+端口设置为 :5280/http-bind/ 之类的内容。此时,您需要确保 Strophe 使用此 URL 而不是实际的 XMPP 端口 5222。

最后,网站域和端口之外的任何资源都需要 CORS。在您的示例中,您的客户端必须向一个 URL 发出请求,该 URL 与页面本身(Strophe 和 Prosody 之间的连接)在不同的端口+域上运行。好消息是,Prosody 已经支持 CORS,并且启用它非常简单。所有这些在我之前链接的页面上都有更详细的解释。

希望有帮助!

关于xmpp - 如何使用 XMPP 协议(protocol)将 strophe.js 客户端与 Prosody 服务器正确连接,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27389825/

10-12 06:10