博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
通过 websocket 连接 openfire
阅读量:6639 次
发布时间:2019-06-25

本文共 5632 字,大约阅读时间需要 18 分钟。

hot3.png

通过 websocket 连接 openfire

一、简介

老版本是需要安装websocket插件的。之前版本就不说了。

二、 引入XML与JSON互转的js

自行百度下载新版本。我使用的版本上传至百度网盘:

链接: 提取码: vfc3

使用方法:

//json转xml  function json2xml(jsonstring) {    var xotree = new XML.ObjTree();    var xml = xotree.writeXML(jsonstring);    //使用jkl-dumper.js中的formatXml方法将xml字符串格式化    //var xmlText = formatXml(xml);    return xml;  }  //xml转json  function xml2json(xmlstring) {    //将xml字符串转为json    var xotree = new XML.ObjTree();    var json = xotree.parseXML(xmlstring);    //将json对象转为格式化的字符串    var dumper = new JKL.Dumper();    var jsonText = dumper.dump(json);    return JSON.parse(jsonText);  }

三、使用

1. 先获取安装的服务器地址

在 首页面可以看到以下信息:

服务器属性    服务器启动时间:    20 天, 23 小时, 22 分钟 -- started 2018-9-5 15:44:47    版本: Openfire 4.2.2    Openfire 主目录:   /var/openfire    服务器名称: lvs-backup-1环境    JVM 版本和供应商: 1.8.0_65 Oracle Corporation -- Java HotSpot(TM) 64-Bit Server VM    应用服务器:  jetty/9.2.z-SNAPSHOT    主机名:    lvs-backup-1    OS/硬件:  Linux / amd64    语言环境/时区:    zh_CN / 中国标准时间 (8 GMT)服务器端口    所有的地址   7070    HTTP绑定  端口用于客户端使用不安全的HTTP方式访问    所有的地址   7443    端口用于网络上以SSL加密的通信,HTTP绑定端口用于客户端使用安全的HTTP方式访问

2. 创建websocket

//地址  var host = "ws://192.168.2.11:7070/ws/"; //创建websocket, OpenFire是实现了WebSocket的子协议websocket = new WebSocket(host, 'xmpp');//连接成功建立的回调方法websocket.onopen = wsopen;//连接发生错误的回调方法websocket.onerror = wserror;//连接关闭的回调方法websocket.onclose = wsclose;//收到消息时执行的方法websocket.onmessage = wsmessage;当websocket连接成功,就需要发起建立流的请求

3. 发起建立流的请求

发送xml

方法

//域名 var to = "lvs-backup-1"; //JID var from = AA@lvs-backup-1; var xmlns = "urn:ietf:params:xml:ns:xmpp-framing"; var version = "1.0"; var xmllang = "zh"; var resource = "appClient"; //发起建立流的请求  function connwsopen() {    var temp = {      "open": {        "-to": to,        "-from": from,        "-xmlns": xmlns,        "-xml:lang": xmllang,        "-version": version      }    };    //转化为xml    var steam = json2xml(temp);    websocket.send(steam);  }

接收XML

服务器返回同意建立流

安全验证的方式,使用PLAIN方式,这种方式是把用户名和密码通过BASE64加密后传输。

PLAIN
SCRAM-SHA-1
CRAM-MD5
DIGEST-MD5

4.登录

使用PLAIN方式,需要对用户名和密码通过BASE64加密

字符串格式是:jid+password,以\0作为分隔符var temp = username + "@" + to + "\0" + password;//Base64编码var token = window.btoa(temp);

发送XML

MTUyNzUwNzYzNTNAbHZzLWJhY2t1cC0xAGUxMGFkYzM5NDliYTU5YWJiZTU2ZTA1N2YyMGY4ODNl

方法

//登录验证  function validatelogin() {    //字符串格式是:jid+password,以\0作为分隔符    var temp = username + "@" + to + "\0" + password;    //Base64编码    var token = window.btoa(temp);    var message = {      "auth": {        "-xmlns": "urn:ietf:params:xml:ns:xmpp-sasl",        "-mechanism": "PLAIN",        "#text": token      }    };    websocket.send(json2xml(message));  }

接收XML

登录成功:

登录失败:

登录验证成功后,需要再发起一个新的流,新的流服务端会给予一些新的XML节点权限(、),这样才能发送一些其他功能的信息,比如发送消息,获取联系人列表,刚开始建立的第一个流失不能发送这些节点的。

5.发起新的流

在发起新的流之前,需要获取到第一个流的id,这个id就是与websocket的会话差不多。

发送XML

方法

id = "1g0xa0mr98"; 第一个流的id //发起新的流  function newopen() {    var temp = {      "open": {        "-xmlns": "jabber:client",        "-to": to,        "-version": version,        "-from": from,        "-id": id,        "-xml:lang": xmllang      }    };    //转化为xml    var steam = json2xml(temp);    websocket.send(steam);  }

接收XML

同意打开新流

接下来需要做bind操作

6. bind

绑定操作,也需要id的,在绑定的时候,可以增加客户端的描述。

appClient:是app的客户端

发送XML

appClient

方法

//bind操作  function bind() {    var temp = {      "iq": {        "-id": id,        "-type": "set",        "bind": {          "-xmlns": "urn:ietf:params:xml:ns:xmpp-bind",          "resource":resource        }      }    };    //转化为xml    var steam = json2xml(temp);    websocket.send(steam);  }

接收

AA@lvs-backup-1/appClient

7. 获取session

发送XML

方法

//获取session  function getsession() {    var temp = {      "iq": {        "-xmlns": "jabber:client",        "-id": id,        "-type": "set",        "session": {"-xmlns": "urn:ietf:params:xml:ns:xmpp-session"}      }    };    //转化为xml    var steam = json2xml(temp);    websocket.send(steam);  }

接收

这个时候,在web页面会话中看到的,账号还是离线状态。对应的消息也收不到。下一步就需要做上线的操作了。

7. 上线

发送XML

online
1

方法

priority:设置优先级的//上线  function presence() {    var temp = {      "presence": {        "-id": id,        "status": "online",        "priority": "1"      }    };    //转化为xml    var steam = json2xml(temp);    websocket.send(steam);  }

接收XML

会把对应的好友发送过来

这时候再看web中的会话,该账号就在线了。

8. 发送消息

发送XML

body:对应的消息内容
标题
你好

方法

number:给谁发message:消息内容 //发消息  function send(number,message) {    var temp = {      "message": {        "-type":"chat",        "-from":  username+"@"+to,        "-to": number+"@"+to,        "subject":"标题",        "body": message      }    };    //转化为xml    var steam = json2xml(temp);    websocket.send(steam);  }

四、 过程

用户名: 15275076353密码: e10adc3949ba59abbe56e057f20f883e正在连接..连接已建立发起建立流的请求: 
接收到的
接收到的
PLAIN
SCRAM-SHA-1
CRAM-MD5
DIGEST-MD5
登录验证:
MTUyNzUwNzYzNTNAbHZzLWJhY2t1cC0xAGUxMGFkYzM5NDliYTU5YWJiZTU2ZTA1N2YyMGY4ODNl
接收到的
登录成功!发起新的流:
接收到的
接收到的
bind操作:
appClient
接收到的
15275076353@lvs-backup-1/appClient
获取session:
接收到的
上线:
online
1
接收到的
接收到的

转载于:https://my.oschina.net/lwenhao/blog/2208991

你可能感兴趣的文章
无线传感器网络中的节点定位技术
查看>>
47款超酷超实用的CSS3技巧教程
查看>>
AspNet MVC中各种上下文理解
查看>>
SQL Server 索引的自动维护 <第十三篇>
查看>>
C++ 容器元素的存储和获取
查看>>
Java之集合类应用总结
查看>>
UVA 11624 Fire!(二次BFS)
查看>>
ACCP6.0 教程课件,可用
查看>>
[hihoCoder] #1122 : 二分图二•二分图最大匹配之匈牙利算法
查看>>
矩阵基本操作的实现(C# 源代码)
查看>>
能用图形分析
查看>>
从装mac mini ssd硬盘所想到的
查看>>
《CSS设计禅机(the Zen of CSS Design)》译者序(草稿)
查看>>
【Android SOAP】基于第三方开源项目ksoap-android
查看>>
用Python开始机器学习(2:决策树分类算法)
查看>>
敏捷技能修炼:敏捷软件开发与设计的最佳实践
查看>>
ChartFX for .NET 6.0.1262.25350 破解
查看>>
msm8610 lcd driver code analysis
查看>>
csharp: read excel using Aspose.Cells
查看>>
简单的邮件客户端
查看>>