You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Ubuntu下ejabberd与xmpp-websocket-client连接失败排查求助

问题分析与解决方案

从你提供的交互日志里能直接定位到问题根源:在SASL认证成功后,客户端重新发送的<stream:stream>请求开头多了<?xml version="1.0"?>声明,而根据XMPP over WebSocket的规范,只有第一次初始化流时需要XML声明,后续的流重启(比如SASL认证完成后)不能再添加这个声明,这直接导致ejabberd判定请求格式错误,返回了not-well-formed的流错误。

具体问题点

看这段关键的客户端请求日志:

CR: <?xml version="1.0"?><stream:stream xmlns:stream="http://etherx.jabber.org/streams" version="1.0" xmlns="jabber:client" to="localhost" xml:lang="en" xmlns:xml="http://www.w3.org/XML/1998/namespace" >

这里的XML声明是多余的,服务器期望的是直接发送<stream:stream>标签内容,不需要前置的XML声明。

解决方案

你需要修改Web客户端的websocket.js代码,调整SASL认证成功后的流重启逻辑:

  1. 找到客户端处理<success xmlns='urn:ietf:params:xml:ns:xmpp-sasl'/>响应的代码段
  2. 定位到重新发送stream流的代码行,去掉开头的<?xml version="1.0"?>,只保留<stream:stream>标签部分。

举个代码调整的例子:
如果原来的代码是:

socket.send('<?xml version="1.0"?><stream:stream xmlns:stream="http://etherx.jabber.org/streams" version="1.0" xmlns="jabber:client" to="localhost" xml:lang="en" />');

修改为:

socket.send('<stream:stream xmlns:stream="http://etherx.jabber.org/streams" version="1.0" xmlns="jabber:client" to="localhost" xml:lang="en" />');

关于ejabberd配置的验证

你的ejabberd.yml配置已经正确开启了WebSocket支持("/ws": ejabberd_http_ws),其他相关配置也没问题——毕竟传统Jabber、Spark客户端能正常连接聊天,所以服务器端不需要做额外调整,问题完全出在Web客户端的流重启逻辑上。

内容的提问来源于stack exchange,提问作者Manoj Kumar

火山引擎 最新活动