目标: 搭建一个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, 5}.
{hosts, ["sagan.me"]}.
{host_config, "sagan.me", [{auth_method, [anonymous,internal]},{anonymous_protocol, sasl_anon}]}.
{listen,
[
{5222, ejabberd_c2s, [
{certfile, "/path/to/ssl/cert.pem"},
%%starttls,
starttls_required,
{access, c2s},
{shaper, c2s_shaper},
{max_stanza_size, 65536}
]},
{5269, ejabberd_s2s_in, [
{shaper, s2s_shaper},
{max_stanza_size, 131072}
]},
{{5280, "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" => 5280
) )
)
应该也可以用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(0).value='connect';
-
}elseif(status==
Strophe.Status.DISCONNECTING){
-
log('Strophe
is disconnecting.');
-
}elseif(status==
Strophe.Status.DISCONNECTED){
-
log('Strophe
is disconnected.');
-
$('#connect').get(0).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>0){
-
varbody
= elems[0];
-
-
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(0);
-
if(button.value=='connect'){
-
button.value='disconnect';
-
-
connection.connect($('#jid').get(0).value,
-
$('#pass').get(0).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通信等功能.
分享到:
相关推荐
基于xmpp推送的服务器和android客户端源码,已调试通过,可以推送到手机客户端
xmpp-over-websocket 的目标是提供一个实时信息基于 xmpp 和 websocket pull 或者 poll 的解决方案。 Getting Started Clone git 库的子模块,运行通讯脚本,然后每个子模块会生成一个发布包。 步骤:1) 部署发布包...
XMPP Prebind for PHP后端此类专为PHP后端设计,用于将XMPP会话与XMPP服务器(如Openfire(已测试),eJabberd等)预先绑定。 换句话说,如果您想使用像这样的前端XMPP客户端并利用PHP的(又名 )优势,那么您来对...
本资源是《XMPP高级编程——使用JavaScript和JQuery》一书附带的源码,十分详细,搭载在服务器上可直接运行...如果要用自己搭建的Openfire之类的XMPP服务器,修改也十分简单,是学习Web环境下的XMPP协议开发的好资料。
XMPP(Android客户端的实现 _Tomcat版的Androidpn_).rar,太多无法一一验证是否可用,程序如果跑不起来需要自调,部分代码功能进行参考学习。
类似于xmpp协议的服务器与客户端代码。具体自己看
An XMPP Framework in Objective-C for Mac and iOS
简易微信客户端和服务器源码.rar,太多无法一一验证是否可用,程序如果跑不起来需要自调,部分代码功能进行参考学习。
xmpp客户端:psi-0.14-win-setup.exe
xmpp-hybrid-app-examples-源码.rar
基于Xmpp协议即时通讯服务器架设及客户端设计 服务器端软件 ejabberd 2.1.6 apache2.2 mysql 安装配置 客户端 strophe(javascript linux下min编译) gloox(c++)库 资料及示例源码
基于XMPP实现android客户端与服务器的交互(源码)
android的XMPP客户端
XMPP网站 客户端位于。 用法 npm install npm start 生成静态资产进行生产: npm run build 已实施的XEP XEP-0054:电子名片 XEP-0153:基于vCard的头像 XEP-0085:聊天状态通知 XEP-0280:消息碳 XEP-0092:软件...
这是使用javascript开发的xmpp的例子,只实现了连接xmpp服务器的操作, 包含主要文件如下: flXHR.js、strophe.flxhr.js、strophe.js、jquery-1.8.3.js、jquery-ui-1.9.2.custom.min.js、flensed.js、checkplayer.js...
JAVA实现XMPP客户端和服务器 成型的软件
内整合用到的框架,实现文本、图片、语音的发送,具体请看我的blog
Xabber for Web是一个开放源代码XMPP客户端,旨在在任何现代浏览器中提供一流的聊天体验。 它的外观和效果很棒,旨在与Xabber的其他版本无缝融合,以用于不同的平台。 特征 精湛的设计 Xabber具有简洁优雅的界面,...
android 基于openfire服务器搭建的xmpp即时聊天客户端 android+asmack+openfire+xmpp
Opa-Web的XMPP聊天客户端介绍 Opa是完全基于Vue , NuxtJS和ElementUI构建的,用于Web(SSR)的开源XMPP聊天客户端,它遵循最酷的趋势再见Flash和桌面客户端! Trivia :在巴西的许多含义中,“ Opa”也被非正式地...