农历(闰六月十四)
关于
友情链接
Toggle navigation
Harries Blog™
追心中的海,逐世界的梦
首页
编程技术
Java
软件架构
移动开发
后端
前端
大数据
数据库
算法
人工智能
测试
100 Days of AI Programming
代码管理
IT教程
springboot-demo
Java入门教程
bootstrap3
CSS
Apache基础教程
php
ionic 教程
Python
mysql教程
eclipse
Ubuntu VPS系统配置
AngularJS 教程
MongoDB教程
Struts2教程
springcloud-demo
Redis教程
Spring教程
Git教程
openfire参考指南
Jenkins进阶系列
Java设计模式
HBase教程
java-demo
Maven教程
hibernate教程
Docker 教程
memcached教程
Quartz指南
Ant教程
java实例教程
Hive教程
SpringCloud
ANTLR教程
XStream教程
Elastic-Job-Lite
Hazelcast教程
深入浅出MyBatis
ibaties教程
SVN教程
rabittmq教程
Hadoop教程
solr教程
WebService CXF学习
JPA教程
ActiveMQ中文指南
Java内存模型
dubbo教程
python3-demo
Linux入门视频教程
生活感悟
默认分类
博主自留地
一周一本书
一月一个人
互联网
互联网.出海
互联网.IPO
运维
Linux
docker
nginx
windows
操作系统
监控软件
vmware
虚拟化
tomcat
自动化
留言板
转载
发表于 2013年04月07日
浏览 (2,060)
评论 (1)
openfire服务器2种性能测试方法
XMPP Server(IM Server)不像Web Server有十分标准的性能评测工具, 一个新的IM服务器拿到之后,通常并没有十分方便的方式来进行测试性能。
通常我们只能依赖网上的数据来衡量某个服务器产品的性能。但是网上的数据通常并不准确,因为测试的环境, 测试的指标不同,测试的方法有差异,得到的结果并没有直接的可比性。我们去验证某些测试结果,得出的数据有2~3倍的差异并不奇怪。
因此最好通过自己的环境去验证这些产品的性能指标,所以构建一套简单的性能测试工具十分重要。目前想到的测试一个XMPP Server的几种方案。
使用 Smack API, 它是一个 Java 的XMPP Client Library,也是由Jive Software开发。
优点:编程简单。
缺点:API并非为大量并发用户设计,每个客户要1个线程,占用资源大,1台机器只能模拟有限(数千个)客户。
例子:http://www.igniterealtime.org/community/message/148722
使用 Java Socket异步NIO select方式, 模拟XMPP登录。XML可直接用string构建,可直接根据XML返回结果的特征字符判断调用是否成功。如使用XML library来解析可能会造成部分自身瓶颈。
优点:可以模拟更多的客户连接。1台客户机可以模拟数万个用户同时操作。
编程稍复杂,需要熟悉Java NIO async socket,或相关框架,如Mina
代码示例,使用MINA模拟客户端连接到服务器
/**
* Use mina client to connect xmpp server
* @author Tim
*
*/
public class XmppClient {
public static void main(String[] args) {
String hostname = "server";
int port = 5222;
SocketConnectorConfig cfg = new SocketConnectorConfig();
cfg.getFilterChain().addLast("codec", new ProtocolCodecFilter(new TextLineCodecFactory()));
for (int i = 1; i <= 2; i++) {
SocketConnector connector = new SocketConnector();
connector.connect(new InetSocketAddress(hostname, port),
new XmppProtocolHandler("tim" + i, "tim", "mina"), cfg);
}
}
}
class XmppProtocolHandler extends IoHandlerAdapter {
String username = "tim";
String password = "tim";
String server = "server";
String bareJid = username + "@" + server;
String resource = "mina";
public XmppProtocolHandler(String username, String password, String resource) {
this.username = username;
this.password = password;
this.resource = resource;
this.bareJid = username + "@" + server;
}
@Override
public void sessionClosed(IoSession session) throws Exception {
System.err.println("Closed. Total " + session.getReadBytes() + " byte(s)");
}
@Override
public void messageReceived(IoSession session, Object message)
throws Exception {
ByteBuffer buf = (ByteBuffer) message;
while (buf.hasRemaining()) {
System.out.print((char) buf.get());
}
System.out.flush();
}
@Override
public void sessionOpened(IoSession session) throws Exception {
sendPacket(session, sendStream(true));
Thread.sleep(50);
sendPacket(session, sendAuth(username, bareJid, password));
Thread.sleep(200);
sendPacket(session, sendStream(false));
Thread.sleep(50);
sendPacket(session, sendResource(username, resource));
Thread.sleep(50);
sendPacket(session, sendPresence(username));
}
private String genPassword(String bareJid, String username, String password) {
String str = bareJid + "\0" + username + "\0" + password;
BASE64Encoder base64 = new BASE64Encoder();
return base64.encode(str.getBytes());
}
private StringBuilder sendStream(boolean addHeader) throws IOException {
StringBuilder sb = new StringBuilder();
if (addHeader)
sb.append("");
sb.append(" .append("\" xmlns=\"jabber:client\" xmlns:stream=\"http://etherx.jabber.org/streams\" version=\"1.0\">"); return sb; } private StringBuilder sendAuth(String username, String bareJid, String password) throws IOException { String pwd = genPassword(bareJid, username, password); StringBuilder sb = new StringBuilder(); sb.append(" .append(pwd).append(""); return sb; } private StringBuilder sendResource(String username, String resource) throws IOException { StringBuilder sb = new StringBuilder(); sb.append(" .append("-0\" type=\"set\"> .append(resource).append(" return sb; } private StringBuilder sendPresence(String username) throws IOException { StringBuilder sb = new StringBuilder(" .append(username).append("-2\" />"); return sb; } private void sendPacket(IoSession session, StringBuilder sb) throws Exception { sb.append("\r\n"); System.out.println(sb.toString()); session.write(sb.toString()); } } 使用 tsung, tsung使用erlang开发,利用了erlang并发编程的优势,可以从一到多个客户机向发起xmpp请求。 优点:利用现成的工具,无需开发。测试过程使用XML来配置,不需要改动源代码。 缺点:配置和扩展复杂,学习成本,适应成本及扩展成本大。 使用 Python 等动态语言开发,如PyXMPP 优点:开发及重构效率比Java稍快,可以更多关注测试模型及指标本身。而不是测试程序怎么实现。 缺点:需要开发人员熟悉相关语言及特性。另外同样有 one thread per client 的问题,占用客户端资源过高。可能要几台客户机才能搞定一台服务器。 代码示例,下面例子可以对实现一个Python的client有个基本了解,详细可参考 PyXMPP examples 下面的例子。 class MyClient(Client): def session_started(self): self.stream.send(Presence()) def idle(self): print "idle" Client.idle(self) if self.session_established: target=JID("tim2",s.jid.domain) self.stream.send(Message(to_jid=target,body=unicode("测试","utf-8"))) def post_disconnect(self): print "Disconnected" raise Disconnected logger=logging.getLogger() logger.addHandler(logging.StreamHandler()) logger.setLevel(logging.DEBUG) libxml2.debugMemory(1) print "creating stream..." s=MyClient(jid=JID("tim@server/Test"),password=u"tim",auth_methods=["sasl:DIGEST-MD5","digest"]) print "connecting..." s.connect() print "processing..." try: try: s.loop(1) finally: s.disconnect() except KeyboardInterrupt: traceback.print_exc(file=sys.stderr) except (StreamError,Disconnected),e: raise libxml2.cleanupParser() if libxml2.debugMemory(1) == 0: print "OK" else: print "Memory leak %d bytes" % (libxml2.debugMemory(1)) libxml2.dumpMemory() 正文到此结束 赞 8 赏 分享 所属分类: openfire参考指南 本文标签: openfire 测试 版权声明: 本文为互联网转载文章,出处已在文章中说明(部分除外)。如果侵权,请联系本站长删除,谢谢。 本文海报: 生成海报一 生成海报二 上一篇 xmpp.org中文版 下一篇 Openfire Scalability 热门推荐 openfire数据库安装指南 浏览(15,692) 评论(0) Caffe 深度学习框架上手教程 浏览(11,796) 评论(0) ReactiveCocoa入门教程:第一部分 浏览(12,599) 评论(0) 开源HIDS-OSSEC使用实例:监测CC攻击 浏览(12,497) 评论(0) Decorators in ES7 浏览(17,153) 评论(4) 用Electron(Atom编辑器的兄弟项目)开发桌面应用 浏览(30,103) 评论(0) Windows下JetBrains CLion中文输出乱码的解决方法 浏览(13,550) 评论(1) 2015年北京下第一场雪留念 浏览(8,273) 评论(17) 同步-@synchronized, NSLock, pthread, OSSpinLock性能比较 浏览(12,435) 评论(0) 【开班了】JAVA培训班正式招生 浏览(8,633) 评论(12) 相关文章 openfire数据库安装指南 openfire SSL支持 openfire自定义数据库集成指南 openfire的JavaDocs openfire协议支持指南 openfire数据库模式 即时通信服务平台部署方案 openfire插件开发 openfire开发时打印日志到控制台 openfire源代码打包部署 openfire参考指南 1 openfire参考指南 2 openfire安装指南 3 openfire升级指南 4 openfire数据库安装指南 5 openfire SSL支持 6 openfire与LDAP集成指南 7 openfire自定义数据库集成指南 8 openfire可插拔的名册支持指南 9 openfire的JavaDocs 10 openfire编译源代码 11 openfire协议支持指南 12 openfire汉化翻译指南 13 openfire数据库模式 14 openfire定制指南 15 openfire服务器2种性能测试方法 16 Openfire Scalability 17 即时通信服务平台部署方案 18 openfire插件开发 19 openfire启动过程 20 openfire开发时打印日志到控制台 21 openfire源代码打包部署 22 openfire2种认证方式 说给你听 本文目录 随机标签 rrdtools SqlServer 对象流 JAVA实例 西方人 内容开放协议 Spring Cloud Config struct reCAPTCHA Office 365 container 上帝 SSPanel-Uim cron TimerTask Canal groovy 反向代理 排名 Micrometer Tracing 集群方案 Agent 企业级服务提供商 equals business 驼峰函数 beanInfoCache jacoco redisTemplate Thumbnailator 对账 Optional jacoco s3 TeamCity 支付系统 longtext 一致性 ISODate 埃隆·里夫·马斯克 数据泄露 db2 groovy 启动资金 XEN 创业 领导 成就全新 页回收机制 Qualifier 配件 书籍教程 springboot-demo Java入门教程 bootstrap3 CSS Apache基础教程 php ionic 教程 Python mysql教程 eclipse Ubuntu VPS系统配置 AngularJS 教程 MongoDB教程 Struts2教程 springcloud-demo Redis教程 Spring教程 Git教程 openfire参考指南 Jenkins进阶系列 Java设计模式 HBase教程 java-demo Maven教程 hibernate教程 Docker 教程 memcached教程 Quartz指南 Ant教程 java实例教程 Hive教程 SpringCloud ANTLR教程 XStream教程 Elastic-Job-Lite Hazelcast教程 深入浅出MyBatis ibaties教程 SVN教程 rabittmq教程 Hadoop教程 solr教程 WebService CXF学习 JPA教程 ActiveMQ中文指南 Java内存模型 dubbo教程 python3-demo Linux入门视频教程 近期评论 Harrries 已经加上 阳光星河 阳光星河 https://www.276227.com Harrries 域名是什么?我重新加上 阳光星河 大佬,我的域名到期,没注意,也没时间更新,就放着,谁知道挂壁了,现在换域名,今天才搬家成功,之前叫言之在线,现在改阳光星河,既然域名都换了,索性也改名算了,很长时间了,我的链接肯定也不在了,不过还是得过来说一声 阳光星河 大佬,我的域名到期,没注意,也没时间更新,就放着,谁知道挂壁了,现在换域名,今天才搬家成功,之前叫言之在线,现在改阳光星河,既然域名都换了,索性也改名算了,很长时间了,我的链接肯定也不在了,不过还是得过来说一声 Wang Fang I really enjoyed reading your post it was both informative and personal, which I think is the perfect combo. You explained things in a simple way that actually helped me understand better. It didn't feel overwhelming at all. Thanks for taking the time to share your experience. It's posts like these that make a real difference for people who are looking for genuine advice. Keep up the great work! I came across Libya's e-visa option while planning a spontaneous trip. Understanding the Libya tourist visa requirements helped me feel confident before booking. Everything was surprisingly straightforward. Once I arrived, I was amazed by the Roman ruins, local hospitality, and peaceful coastal towns. It felt like stepping into a place that time forgot, in the best way. han25vox Interesting post! Harrries 暂时不支持rss Sul 请问站点支持RSS吗,url是什么?解析不到,看了下首页源码里好像也没有。 admin 已加上 随机文章 站长推荐 近期文章 1 Thor:Mac 上快速打开或切换应用工具 2 水手放映室:面向 Android 设备的互联网免费视频播放客户端 3 聊一聊淘宝首页和它背后的一套 4 Low-Poly图像生成器 5 【译】考虑 6 CTO训练营曲毅:创业公司的事与人 7 Java的String对象不可修改? 8 使用安卓支持库,Material design 无处不在 9 架构的坑系列:重构过程中的过度设计 10 不要在存储过程中控制事务 1 VPS 自我监控 2 springboot接入多个ES启动时候自检报错 3 配置虚拟站点 4 openfire协议支持指南 5 修改上传文件权限 6 OpenVZ VPS 额外支持 7 2015年北京下第一场雪留念 8 openfire定制指南 9 mysql存储过程实例一:游标的使用 10 Linux删除或者新增SWAP分区 1 ️ Netcup 最便宜服务器购买指南(2025 最新版) 2 深入探索Java虚拟机的神秘接口:JVMTI 3 只需要75美元就可以拥有一个终身免费的邮箱服务(250G+15个域名) 4 Day1:Project Kick-off Meeting Content(100 Days of AI Programming) 5 Using AI to build a recruitment website plan(100 Days of AI Programming) 6 Augment Agent:自动生成代码的未来 7 使用 acme.sh 自动更新 SSL 证书的指南 8 使用Cloudflare加速网站的具体操作步骤 9 如何开通google Free Tier长期免费云服务器(1C/1G) 10 如何获取oracle cloud永久免费的vps(4C/24G)? 网站信息 文章总数:82,771 篇 文件总数:284,424 个 标签总数:2,447 个 分类总数:86 个 留言数量:2,575 条 在线人数:692 人 运行天数:4,667天 最后更新:2025年08月07日13点 × 输入密码查看文章详情 确定 × 搜索文章 搜索 热门搜索: Java Springboot Linux Maven Bootstrap 阿里云 × 评论信息框 可以通过QQ号实时获取昵称和头像 QQ 昵称 邮箱 网址 提交评论 × 山无棱江水为竭,冬雷震震夏雨雪,才敢请君舍 支付宝 微信 转账时请备注“博客赞助” Loading... 其他链接 阿里云券 域名出售 网站地图 关于本站 友情链接 免责声明 关于本站 本站定位:个人技术类博客 本站作用:写博客、记日志、闲聊扯淡鼓捣技术。 问题交流 托管于阿里云 · 京ICP备14030975号-1 Copyright©2025 · Harries Blog™ 标签的样式