Android XMPP服务器, BOSH(Http-Binding)和WEB客户端搭建
目标: 搭建一个XMPP服务器, 实现在web page上用javascript与自己XMPP服务器通信, 匿名登录并与任何一个XMPP(Jabber)帐户通信. (Gtalk目前尚有问题)
XMPP服务器可能不是必须的(见下文, 我没有尝试)
环境与配置:
XMPP服务器:ejabberd文档
HTTP-Binding: 使用ejabberd搭建, 5280端口.
Javascript Client:Strophe文档
安装Ejabberd
yuminstallejabberd
#apt-get install ejabberd
编辑配置文件: /etc/ejabberd/ejabberd.cfg, 这是个era lang格式配置文件, 行注释符号是%. 请参考ejabberd文档.
下面是默认配置文件里我修改过部分:
%%debug
{loglevel, }.
{hosts, ["sagan.me"]}.
{host_config, "sagan.me", [{auth_method, [anonymous,internal]},{anonymous_protocol, sasl_anon}]}. {listen,
[
{, ejabberd_c2s, [
{certfile, "/path/to/ssl/cert.pem"},
%%starttls,
starttls_required,
{access, c2s},
{shaper, c2s_shaper},
{max_stanza_size, }
]},
{, ejabberd_s2s_in, [
{shaper, s2s_shaper},
{max_stanza_size, }
]},
{{, "127.0.0.1"}, ejabberd_http, [
{request_handlers, [{["http-bind"], mod_http_bind}]},
captcha
]} ]}.
{s2s_use_starttls, true}.
{s2s_certfile, "/path/to/ssl/cert.pem"}.
{s2s_default_policy, allow}.
{auth_method, [internal, anonymous]}.
上面配置中, 声明监听127.0.0.1(本地IP地址) 5280端口为http-binding (BOSH)服务地址, 路径是"http-bind", 即服务实际URI是"http://127.0.0.1:5280/http-bind". 然后需要在web服务器配置中用mod_proxy或mod_rewrite将80或443端口上对 "/http-bind" 访问转发到"http://127.0.0.1:5280/http-bind", 因为由于浏览器同源限制, yourdomain.com:80上的web page是无法直接向yourdomain.tld:5280提交ajax请求的. ( 所以在上面配置中把ejabberd http-bind监听的端口设为了127.0.0.1:5280, 即不能从外部直接访问)
添加域名DNS SRV记录
这一步是必须的, 否则搭建的XMPP服务器基本上无法与大多数其它服务器或客户端通信. (插一句: Google Apps Talk基于XMPP平台, 如果不设置域名SRV记录的话, 就只能够用Gtalk登录(无法使用其它XMPP客户端), 而且只能和gmail.com或其它Google Apps域名的帐户通信)
_xmpp-client._tcp.sagan.me. 86400 IN SRV 10 0 5222 sagan.me.
_xmpp-server._tcp.sagan.me. 86400 IN SRV 10 0 5269 sagan.me.
5269和5222是XMPP在ICANN注册的标准端口.
修改WEB服务器配置
我的Lighttpd ModProxy配置:
proxy.server = (
"/http-bind" => ( (
"host" => "127.0.0.1",
"port" =>
) )
)
应该也可以用web服务器直接转发请求到外部某个公开的Jabber (XMPP)服务器 http-bind地址, 我没有尝试. (基本上找不到公开的提供http-bind的XMPP服务器)
使用Javascript客户端
上面ejabberd配置里开启了匿名登录(ANOYMOUS mechanism), 最终目的就是为了在web page中匿名访问服务并向任何一个XMPP帐户发送消息.
下载Strophe JS库并上传到你的域名目录下(这个库只有一个文件strophe.js), 下面这个测试例子修改自Strophe examples目录下echobot.html
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Strophe.js Echobot Example</title>
<script type='text/javascript'
src='http://ajax.googleapis.com/ajax/libs/jquery/1.2.6/jquery.min.js'></script>
<script type='text/javascript'
src='../strophe.js'></script>
<script type='text/javascript'
src='echobot.js'></script>
</head>
<body>
<div id='login' style='text-align: center'>
<form name='cred'>
<label for='jid'>JID:</label>
<input type='text' id='jid' value="sagan.me" />
<label for='pass'>Password:</label>
<input type='password' id='pass' />
<input type='button' id='connect' value='connect' />
</form>
</div>
<hr />
<div id='log'></div>
</body>
</html>
看echobot.js
varBOSH_SERVICE ='/xmpp-httpbind';
varconnection =null;
functionlog(msg)
{
$('#log').append('<div></div>').append(document.createTextNode(msg));
}
functiononConnect(status)
{
if(status== Strophe.Status.CONNECTING){
log('Strophe is connecting.');
}elseif(status== Strophe.Status.CONNFAIL){
log('Strophe failed to connect.');
$('#connect').get().value='connect';
}elseif(status== Strophe.Status.DISCONNECTING){
log('Strophe is disconnecting.');
}elseif(status== Strophe.Status.DISCONNECTED){
log('Strophe is disconnected.');
$('#connect').get().value='connect';
}elseif(status== Strophe.Status.CONNECTED){
log('Strophe is connected.');
log('ECHOBOT: Send a message to '+ connection.jid+
' to talk to me.');
connection.addHandler(onMessage,null,'message',null,null, null);
connection.send($pres().tree());
varreply = $msg({to:"ono@oogami.name", from: connection.jid, type:'chat'}).c("body").t("Test Chat Message");
connection.send(reply.tree());
}
}
functiononMessage(msg){
varto = msg.getAttribute('to');
varfrom = msg.getAttribute('from');
vartype = msg.getAttribute('type');
varelems = msg.getElementsByTagName('body');
if(type =="chat"&&elems.length>){
varbody = elems[];
log('ECHOBOT: I got a message from '+ from +': '+
Strophe.getText(body));
varreply = $msg({to: from, from: to, type:'chat'})
.cnode(Strophe.copyElement(body));
connection.send(reply.tree());
log('ECHOBOT: I sent '+ from +': '+ Strophe.getText(body));
}
// we must return true to keep the handler alive.
// returning false would remove it after it finishes.
returntrue;
}
$(document).ready(function(){
connection =newStrophe.Connection(BOSH_SERVICE);
// Uncomment the following lines to spy on the wire traffic.
//connection.rawInput = function (data) { log('RECV: ' + data); };
//connection.rawOutput = function (data) { log('SEND: ' + data); };
// Uncomment the following line to see all the debug output.
//Strophe.log = function (level, msg) { log('LOG: ' + msg); };
$('#connect').bind('click',function(){
varbutton = $('#connect').get();
if(button.value=='connect'){
button.value='disconnect';
connection.connect($('#jid').get().value,
$('#pass').get().value,
onConnect);
}else{
button.value='connect';
connection.disconnect();
}
});
});
将ono@oogami.name修改为一个测试Jabber帐号. 然后用浏览器打开echobot.html, 点击Connect按钮, Strophe就会匿名登录到刚刚建立的ejabber服务器( sagan.me ), 并向 "ono@oogami.name"这个帐号发送一条"Test Message"的信息.
另: 测试匿名登录向somebody@gtalk.com 发送消息失败, log里显示Gtalk服务器返回信息是503 error, Service-Unavailable, 但如果正常登录并添加Gtalk为好友的话则可以. Gtalk禁止了匿名用户向其发送消息? 我还在查资料中.
我准备用Javascript写一个简单的XMPP WEB匿名客户端, 实现允许访客直接与Gtalk和Facebook Chat通信等功能
http://www.ibm.com/developerworks/cn/xml/tutorials/x-realtimeXMPPtut/index.html
Android XMPP服务器, BOSH(Http-Binding)和WEB客户端搭建的更多相关文章
- Strophe.js连接XMPP服务器Openfire、Tigase实现Web私聊、群聊(MUC)
XMPP(Extensible Messaging and Presence Protocol)是一种网络即时通讯协议,它基于XML,具有很强的扩展性,被广泛使用在即时通讯软件.网络游戏聊天.Web聊 ...
- 从高处理解android与服务器交互(看懂了做开发就会非常的容易)
今天帮一个朋友改一个bug 他可以算是初学者吧 .我给他看了看代码,从代码和跟他聊天能明显的发现他对客户端与服务器交互 基本 不是很了解.所以我花了更多时间去给他讲客户端与服务器的关系.我觉得从这个高 ...
- XMPP 服务器 Openfire 的 Emoji 支持问题(进行部分修改)
当前最新版3.9.3已经可以支持Emoji ----------------------------------------------------------------------------- ...
- 常用的XMPP服务器
1. Openfire (Wildfire) 3.x 底层通讯采用的mina框架,minak框架其实性能一般,netty早已经超越它,虽然最初都是Doug Lea写的.3.4版本之后支持集群,单台服务 ...
- Android中FTP服务器、客户端搭建以及SwiFTP、ftp4j介绍
本文主要内容: 1.FTP服务端部署---- 基于Android中SwiFTP开源软件介绍: 2.FTP客户端部署 --- 基于ftp4j开源jar包的客户端开发 : 3.使用步骤 --- 如何测试我 ...
- Android - 向服务器发送数据(POST) - HTTPClient.
该篇文章主要说明使用Apache提供的HTTPClient,通过post方式,向服务器发送数据.由于有些东西在 Android - 向服务器发送数据(GET)中提到过,就不再重复. 一,Android ...
- 基于MAC10.12+MYSQL5.7.17搭建XMPP服务器【黑苹果系统】
在以前的公司中了解到XMPP可以搭建即时通讯APP.出于好奇自己在空余时间也学了一下搭建XMPP服务器,其中遇到了许多问题,经过坎坷的路程终于搭建成功[这些坎坷的经历主要是由于自己的无知造成的] 下面 ...
- android 与 服务器通信
android 与 服务器通信 服务端代码: (1)control 层 /** * 用户登录 * @return */ @RequestMapping(value = "/login&quo ...
- 代码实现PHP web服务器下绝对路径到Web网址的转换
代码实现PHP web服务器下绝对路径到Web网址的转换 代码中用到几个系统变量或常量: 1. 路径中各目录分隔字符 DIRECTORY_SEPARATOR(常量),Windows下DIRECTORY ...
随机推荐
- 洛谷—— P1162 填涂颜色
https://www.luogu.org/problem/show?pid=1162 题目描述 由数字0 组成的方阵中,有一任意形状闭合圈,闭合圈由数字1构成,围圈时只走上下左右4个方向.现要求把闭 ...
- IOS的UIWebView中JS点击事件,需要加入cursor:pointer;属性才可以
IOS的UIWebView中JS点击事件,需要加入cursor:pointer;属性才可以. Android的WebView可以支持外链样式,js文件:IOS则需要改为内嵌样式和JS文件.
- C语言库函数,头文件
参看:https://zhidao.baidu.com/question/328173842.html 该文件包含了的C语言标准库函数的定义 stdlib.h里面定义了五种类型.一些宏和通用工具函数. ...
- Android 6.0 扫描不到 Ble 设备需开启位置权限
Android 6.0 扫描不到 Ble 设备需开启位置权限 之前做 Ble 开发都是在 Android 6.0 系统以下的版本中进行测试的,今天使用 Android 6.0 的设备测试的时候,发现扫 ...
- oled模块的驱动芯片和pcb图
参考自:http://blog.sina.com.cn/s/blog_57ad1bd20102wtq8.html oled的驱动芯片是:SSD1306驱动芯片,这个芯片嵌入在屏幕里面,从外面看不出来, ...
- JNI各种环境下编译方法及初期出错分析
转自 https://www.cnblogs.com/xyang0917/p/4172490.html 第五步.将C/C++代码编译成本地动态库文件 动态库文件名命名规则:lib+动态库文件名+后缀( ...
- php实现 24点游戏算法
php实现 24点游戏算法 一.总结 一句话总结:把多元运算转化为两元运算,先从四个数中取出两个数进行运算,然后把运算结果和第三个数进行运算,再把结果与第四个数进行运算.在求表达式的过程中,最难处理的 ...
- vagrant 的安装与使用
1. 安装 ubuntu 安装vagrant过程 ubuntu 安装 vagrant 时需要首先安装 virtualbox: (1)下载安装与当前 ubuntu 版本相适应的 virtualbox 安 ...
- wepy小程序实现列表分页上拉加载(2)
第一篇:wepy小程序实现列表分页上拉加载(1) 本文接着上一篇内容: 4.优化-添加加载动画 (1)首先写加载动画的结构和样式 打开list.wpy文件 template结构代码: <temp ...
- autohotkey 自动登录输入用户名密码 getElementsByTagName/getElementsByClassName/getElementById
针对button未设置id的.可以通过getElementsByTagName获取button的对象数组,再明确其在对象数组中的位置,如第4个button,通过[3]获取.再调用此对象的click() ...