Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用XMPP协议正确连接strophe.js客户端和Prosody服务器_Xmpp_Strophe_Prosody Im - Fatal编程技术网

如何使用XMPP协议正确连接strophe.js客户端和Prosody服务器

如何使用XMPP协议正确连接strophe.js客户端和Prosody服务器,xmpp,strophe,prosody-im,Xmpp,Strophe,Prosody Im,我已经安装并配置了Prosody服务器。它在标准localhost:5222上侦听。在配置文件中添加了管理员-user1@example.com. 对服务器的每个请求都以错误结束: <stream:stream xmlns:stream="http://etherx.jabber.org/streams" xmlns="jabber:client" id="" version="1.0"> <stream:error> <not-well-f

我已经安装并配置了Prosody服务器。它在标准localhost:5222上侦听。在配置文件中添加了管理员-user1@example.com. 对服务器的每个请求都以错误结束:

<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>
在控制台中,我看到错误:

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.
如何将“访问控制允许来源”标题添加到请求中

当我尝试将请求发送到localhost:5222(不带http)时,我得到:

XMLHttpRequest cannot load localhost:5222. Cross origin requests are only supported for HTTP.
WebSocket connection to 'ws://localhost:5222/' failed: Error during WebSocket handshake: Unexpected response code: 200 
当我通过websocket发送时,我得到:

XMLHttpRequest cannot load localhost:5222. Cross origin requests are only supported for HTTP.
WebSocket connection to 'ws://localhost:5222/' failed: Error during WebSocket handshake: Unexpected response code: 200 
Fiddler向我提供协议违反报告:

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绑定(也称为BOSH)

XMPP vs波什 Strophe讲XMPP,但它的独特之处在于它实际上并不使用XMPP协议传输数据,而是依赖于BOSH(即,同步HTTP上的双向流)。这是因为XMPP协议被设计成始终保持客户端和服务器的连接,我们都知道HTTP不是这样工作的。简单地说,BOSH允许HTTP客户端异步接收数据,而无需显式请求数据。如果你有更多关于波什的问题,让我知道,我会尽我最大的努力解释是什么,以及为什么你需要它

在连接Strophe之前,必须在prosody中启用此功能,请查看此链接以获得设置

一旦设置了BOSH,就需要更改客户端代码以使用不同的地址。很可能您已经为BOSH设置了路径+端口,例如
:5280/httpbind/
。此时,您需要确保Strophe使用的是这个URL,而不是实际的XMPP端口5222

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


希望有帮助

谢谢你的回答。我已经配置了BOSH,它可以工作,但是我仍然得到关于CORS的错误,尽管我已经添加到配置文件:cross_domain_BOSH=true error:XMLHttpRequest无法加载。请求的资源上不存在“Access Control Allow Origin”标头。因此,不允许访问源“”。此外,如果您能给我一些如何注册用户的建议,我将不胜感激。从Prosody的文档中,我知道我需要设置allow_registration=true,但如何建立特定的登录名和密码?我会在更改配置后尝试重新启动Prosody,您可以通过浏览
localhost:5280/crossdomain.xml
轻松测试CORS是否启用。如果找不到此文件,则CORS尚未启用。另外,确保配置的全局部分中有
cross-domain bosh=true
。另外,请尝试在
/http bind
之后再添加一个反斜杠,例如:
/http bind/
。问题似乎出在crossdomain.xml上。我应该补充什么?或者有没有办法生成它呢?关于用户注册,一旦您将服务器配置为允许注册,其余的就由您的客户端代码来实现了。XEP-077()中概述了注册用户的过程。一旦您开始使用Strophe,XEP文档将成为您的宝贵资源。用户注册的过程太多了,无法在评论中解释,它值得自己提出问题(如果还没有人问过!)。应该通过韵律为您生成
crossdomain.xml
。我个人从未使用过韵律,所以我不知道为什么它不起作用。您是否尝试重新启动所有相关韵律服务?