开源聊天服务器openfire

扣子卡片:AI智能体落地的关键用户界面 AI智能体(AI Agent)的核心价值不在于模型多强,而在于能否被用户有效感知与使用。卡片作为智能体的声明式信息封装协议,将文本输出升维为结构化、可交互、跨端一致的信息块,本质是JSON Schema驱动的轻量级用户界面。它解决的是智能体从‘能运行’到‘被采纳’的最后一公里问题——通过富媒体呈现、按钮触发二次调用、多平台适配等能力,显著提升点击率、停留时长与任务闭环率。在微信、飞书、企业微信等主流IM场景中,卡片已成为连接插件能力、工作流决策与终端用户的最小可行交付单元,也是初学者快速上手‘扣子智能体搭建 阅读详情

前段时间为了做聊天的功能差不多是崩溃了,就光处理下这些聊天的逻辑头都大了后来查资料发现可以用一些开源的聊天服务器来做,后期只需整合一下数据就OK了。基于多方面的考虑就选取了openfire做为聊天服务器,同时呢使用spark和如意通来进行开发测试

openfire和spark以及smack的下载地址是:http://www.igniterealtime.org/downloads/index.jsp

如意通的下载地址是:http://rm.rooyeetone.com/down.html


1.openfire聊天服务器的安装

 这个基本上就像安装普通软件那样,最主要的还是openfire的配置,此服务器需要可能会使用到数据库(非必须),openfire也是支持主流的数据库服务器的如oracle,SQLServer,mysql等。只需要配置一下就OK了,如果是除mysql数据库的话还要把数据库驱动jar包放在openfire安装目录的lib文件夹里。这些准备工作做好之后就可以开始配置openfire了。这个我给大家找了个连接,自己仿照着做就好了。连接如下:
http://blog.youkuaiyun.com/shiyanhui66/article/details/6929729

这里需要注意一下域的配置,这个域以后将是账号的组成部分

配置成功后可以使用下载好的如意通或者spark测试一下能不能聊天,spark只需提供服务器,账号,密码就可以用了,如意通则需要更改一下配置,加上聊天服务器的端口号

聊天测试成功后就可以进行开发了,开发的话可以使用smack,strophejs等进行开发,这样问题也随之而来了,例如项目用的是tomcat但是聊天服务器却在其他地方,这样就会产生跨域的问题了。怎么解决这个问题呢,后来也是通过网上搜答案知道可以用nginx来做反向代理,先来看下nginx的作用吧:

Nginx ("engine x") 是一个高性能的 HTTP 和 反向代理 服务器,也是一个 IMAP/POP3/SMTP 代理服务器。 Nginx 是由 Igor Sysoev 为俄罗斯访问量第二的 Rambler.ru 站点开发的,第一个公开版本0.1.0发布于2004年10月4日。其将源代码以类BSD许可证的形式发布,因它的稳定性、丰富的功能集、示例配置文件和低系统资源的消耗而闻名

  这个服务器地启停很简单的,下面是简单的使用

(1)启动nginx服务器

要停止的话就使用命令:nginx -s quit     ,     很简单吧懒惰的话可以去任务管理器里干掉进程就OK了



下面就是nginx的配置了,为了解决跨域的问题我们就必须配置一下代理,nginx此时还承担着连接openfire服务器的重任,因此我们要在nginx根目录下conf文件夹下找到nginx.conf,打开后配置一下代理以及openfire的绑定,文件配置如下

在server下面更改配置,内容如下

location / {
            proxy_pass http://127.0.0.1:8080/;
        }

        location /http-bind {
 
            proxy_pass http://127.0.0.1:7070/http-bind/;
 
            proxy_buffering off;
 
            proxy_redirect off;
 
            proxy_read_timeout 120;
 
            proxy_connect_timeout 120;
 
       }

第一个就不用说了吧,下面那个就是openfire的http绑定了,这个配置在后面的开发中会使用到,只要nginx和tomcat都启动了就可以用了。需要注意的是此后我们的服务器地址就变成了http://127.0.0.1/了此时就不用写8080了。下面看下上面的配置起到了什么作用

var BOSH_SERVICE = 'http://127.0.0.1/http-bind/';
var connection = null;

function log(msg) 
{
    $('#log').append('<div></div>').append(document.createTextNode(msg));
}

function onConnect(status)
{
    if (status == Strophe.Status.CONNECTING) {
	log('Strophe is connecting.');
    } else if (status == Strophe.Status.CONNFAIL) {
	log('Strophe failed to connect.');
	$('#connect').get(0).value = 'connect';
    } else if (status == Strophe.Status.DISCONNECTING) {
	log('Strophe is disconnecting.');
    } else if (status == Strophe.Status.DISCONNECTED) {
	log('Strophe is disconnected.');
	$('#connect').get(0).value = 'connect';
    } else if (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());
    }
}

function onMessage(msg) {
    var to = msg.getAttribute('to');
    var from = msg.getAttribute('from');
    var type = msg.getAttribute('type');
    var elems = msg.getElementsByTagName('body');

    if (type == "chat" && elems.length > 0) {
	var body = elems[0];

	log('ECHOBOT: I got a message from ' + from + ': ' + 
	    Strophe.getText(body));
    
	var reply = $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.
    return true;
}

$(document).ready(function () {
    connection = new Strophe.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 () {
	var button = $('#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();
	}
    });
});

上面这个就是strophejs开发库里连接openfire的代码了,BOSH_SERVICE是连接openfire的地址,也就是我们配置在nginx里的那个地址。这样开发之前的准备工作就做好了。我这里只是举了一个例子,开发的话还可以使用smack来和聊天服务器交互。这里给大家解释下JID,这个就是openfire上的用户id了,例如我们在聊天服务器上加了一个名称为liming的用户,那么 该用户的JID则是liming@openfire的域,密码的话没变化。

但是实际的开发我们可能还要整合现有数据,mysql的话整合起来比较简单,oracle主要就是连接字符串难写一点。openfire也给我们提供了集成现有数据库的文档,一步一步按照文档做下去根本就行不通,这个我们就需要去修改一下openfire的ofproperty数据表



这个是部分的修改,还有下面这个部分


这里需要说明的是,虽然官方的集成文档虽然写的有问题但是还是建议大家看一下,集成的时候需要具备的就是熟悉现有的数据表结构。第一个和第二个红框以及倒数第二个是整合我们的现有数据写的sql,其余部分则是相应的修改,此时我们将不使用默认的provider了而是改成我们所需要的。整合的时候如果出问题了就看看数据库是不是少了什么配置。方便起见我吧这些sql弄出来了,大家照着修改下就可以整合成功了。

insert into OFPROPERTY (NAME, PROPVALUE)
values ('xmpp.domain', 'will');
insert into OFPROPERTY (NAME, PROPVALUE)
values ('xmpp.auth.anonymous', 'false');
insert into OFPROPERTY (NAME, PROPVALUE)
values ('admin.authorizedJIDs', 'chenruiyin2@will,admin@will');
insert into OFPROPERTY (NAME, PROPVALUE)
values ('jdbcUserProvider.loadUserSQL', 'SELECT name,email FROM member WHERE member_name=?');
insert into OFPROPERTY (NAME, PROPVALUE)
values ('jdbcUserProvider.allUsersSQL', 'SELECT member_name FROM member');
insert into OFPROPERTY (NAME, PROPVALUE)
values ('jdbcUserProvider.searchSQL', 'SELECT member_name FROM member WHERE');
insert into OFPROPERTY (NAME, PROPVALUE)
values ('jdbcUserProvider.nameField', 'name');
insert into OFPROPERTY (NAME, PROPVALUE)
values ('jdbcAuthProvider.passwordSQL', 'SELECT sparkpassword FROM member WHERE member_name=?');
insert into OFPROPERTY (NAME, PROPVALUE)
values ('provider.admin.className', 'org.jivesoftware.openfire.admin.DefaultAdminProvider');
insert into OFPROPERTY (NAME, PROPVALUE)
values ('provider.group.className', 'org.jivesoftware.openfire.auth.JDBCGroupProvider');
insert into OFPROPERTY (NAME, PROPVALUE)
values ('jdbcUserProvider.userCountSQL', 'SELECT COUNT(*) FROM member');
insert into OFPROPERTY (NAME, PROPVALUE)
values ('jdbcUserProvider.emailField', 'email');
insert into OFPROPERTY (NAME, PROPVALUE)
values ('jdbcAuthProvider.passwordType', 'plain');
insert into OFPROPERTY (NAME, PROPVALUE)
values ('register.inband', 'true');
insert into OFPROPERTY (NAME, PROPVALUE)
values ('passwordKey', 'ITLXuR7vnS853ic');
insert into OFPROPERTY (NAME, PROPVALUE)
values ('xmpp.socket.ssl.active', 'true');
insert into OFPROPERTY (NAME, PROPVALUE)
values ('provider.lockout.className', 'org.jivesoftware.openfire.lockout.DefaultLockOutProvider');
insert into OFPROPERTY (NAME, PROPVALUE)
values ('provider.auth.className', 'org.jivesoftware.openfire.auth.JDBCAuthProvider');
insert into OFPROPERTY (NAME, PROPVALUE)
values ('provider.vcard.className', 'org.jivesoftware.openfire.vcard.DefaultVCardProvider');
insert into OFPROPERTY (NAME, PROPVALUE)
values ('xmpp.session.conflict-limit', '0');
insert into OFPROPERTY (NAME, PROPVALUE)
values ('jdbcGroupProvider.groupCountSQ', 'SELECT count(*) From v_group');
insert into OFPROPERTY (NAME, PROPVALUE)
values ('jdbcGroupProvider.allGroupsSQL', 'Select Name FROM v_group');
insert into OFPROPERTY (NAME, PROPVALUE)
values ('jdbcGroupProvider.userGroupsSQL', 'SELECT groupName FROM group_menber Where menber_id=?');
insert into OFPROPERTY (NAME, PROPVALUE)
values ('jdbcGroupProvider.descriptionSQL', 'Select Explain From v_group WHERE groupName=?');
insert into OFPROPERTY (NAME, PROPVALUE)
values ('jdbcGroupProvider.loadMembersSQL', 'SELECT menber_id FROM group_menber Where  menber_id!=''402881ec3af924b1013af926748d0001''');
insert into OFPROPERTY (NAME, PROPVALUE)
values ('jdbcGroupProvider.loadAdminsSQL', 'SELECT menber_id FROM group_menber Where  menber_id=''402881ec3af924b1013af926748d0001''');
insert into OFPROPERTY (NAME, PROPVALUE)
values ('register.password', 'true');
insert into OFPROPERTY (NAME, PROPVALUE)
values ('provider.user.className', 'org.jivesoftware.openfire.user.JDBCUserProvider');
insert into OFPROPERTY (NAME, PROPVALUE)
values ('provider.securityAudit.className', 'org.jivesoftware.openfire.security.DefaultSecurityAuditProvider');
insert into OFPROPERTY (NAME, PROPVALUE)
values ('locale.timeZone', 'GMT');
insert into OFPROPERTY (NAME, PROPVALUE)
values ('update.lastCheck', '1354241336597');
insert into OFPROPERTY (NAME, PROPVALUE)
values ('xmpp.httpbind.scriptSyntax.enabled', 'true');
insert into OFPROPERTY (NAME, PROPVALUE)
values ('jdbcProvider.driver', 'oracle.jdbc.driver.OracleDriver');
insert into OFPROPERTY (NAME, PROPVALUE)
values ('jdbcUserProvider.usernameField', 'member_name');
insert into OFPROPERTY (NAME, PROPVALUE)
values ('httpbind.enabled', 'true');
insert into OFPROPERTY (NAME, PROPVALUE)
values ('jdbcProvider.connectionString', 'jdbc:oracle:thin:hylogistics2/hylogistics2@192.168.1.210:1521:ORCL');

到这里的话整合就成功了,以上的修改也可以登录到openfire控制台进行操作,具体的细节大家自己去摸索。安装或整合出问题可以给我写评论我会给大家回复。

webSocket4xmpp:这是webSocket通过xmpp子协议调用openfire的例子 webRtcDemo 这是使用Websockets的聊天服务的简单示例。 我使用jetty通过http和Netty提供静态文件,以处理webRTC通信。 此示例基于khs-stockticker: 使用的技术: Http服务器的码头WebSocket服务器的净额GSON用于JSON数据Maven构建工具 操作说明: 打开控制台并执行“ mvn jetty:run”以在端口9080上启动http服务器 在新控制台中,执行“ mvn测试”以在端口9090上编译并运行Netty Websocket服务器 打开Web浏览器,然后转到URL 注意:Jetty和Netty应该在同一服务器上运行,因为websocket URL是使用Jetty的主机名构建的。 这在客户端javascript(webRtcDemo.js)中进行了硬编码。 同样,Netty服务器的端口也应为9090,因为它也 立即下载

相关推荐

openfire安装WebSocket插件

NULL 博文链接:https://bsr1983.iteye.com/blog/2240070

[Openfire]使用WebSocket建立Openfire的客户端

  近日工作闲暇之余,对IM系统产生了兴趣,转而研究了IM的内容。找了半天,知道比较流行的是Openfire的系统,Openfire有许多平台实现,由于我是做Web的,所以当然是希望寻找Web的实现。Openfire的以前的Web实现,是基于Http-bind的一种长轮询机制,当然也没什么不好,只是我现在HTML5都开始了,当然希望能够来个基于Websocket的机制了。然而Google&am...

weixin_30834019的博客 525

xmpp+Android+openfire 即时通讯,仿微信发语音,文字,图片

原项目地址 :https://download.youkuaiyun.com/download/annding118/7762109, 有些问题,改了一些东西。搭建环境 自己搞定 1.在 XmppConnection 文件 改openfire 服务器地址 就ok, 2. 只能2台手机 安卓和安卓之间通讯,不能和电脑spark,ios等 。3.发送语音信息 显示 语音信息 点一下可以播放, 这个文字可以改个图片 或者什么符号代替。 有一下bug 初学者可以多熟悉

OpenFire源码学习之十二:HttpBind&Script Syntax

HttpSessionManager 该类管理所有通过httpbing连接到openfire的议定。它是一个同步http的双向流 http://www.xmpp.org/extensions/xep-0124.html 构造方法:HttpSessionManager() 配置一个汇集执行者对异步路由传进来的数据的默认大小配置默认为60秒 注意:在默认情况下,服务支持最大254个客...

weixin_30629653的博客 261

MAC 青花瓷(Charles)爪机HTTPS 抓包

前段时间跟之前的产品小姐姐聊天,小姐姐说开发让她抓包帮忙看下数据,然而自己又不会,那就来写一篇简易版的教程 冲冲冲! 手上只有mac电脑跟iPhone手机,只做苹果手机的抓包,android7.0以上版本也没法通过正常的抓htts的包,让安卓开发装个后门吧,不是安卓开发并不知道是啥,连上USB之后访问chrome://inspect/#devices就能很简单的抓包 一、准备工具等 青花瓷...

Promise的博客 1614

springcloud教程 -- 1.快速搭建入门级demo,看这一篇就够了

废话不多讲,跟紧我,开启你的SpringCloud初体验 首先回顾微服务的基本组成: [图片 here] 生产者:提供服务 消费者:消费服务 服务注册/发现中心:服务注册,发现,监控 所以,首先明白springcloud微服务的架构基础:生产者(client),消费者(client),服务注册/发现中心(server)

叶巨岩的博客 8万+

WebSocket集成XMPP网页即时通讯2:Openfire网关集成

待整理 ==

昕友软件博客 167

Centos7安装NVIDIA驱动并在docker容器中使用GPU

Centos7安装NVIDIA驱动并在docker容器中使用GPU

运维giao的博客 2084

openfire 搭建聊天服务器 xmpp协议实现web在线聊天功能

最近在看开源项目conversejs 实现的在线web聊天工具源码; 这个源码采用 backbone.js + strophe.js +各中js 的npm 插件 实现 前端web页面效果,通过xmpp协议链接到openfire服务器; 相比现在的angularjs框架技术,converse...

chuancha4525的博客 1172

ifix5.8连接ab plc的点-通过rslinx

以ifix连接ab plc的点为例 1.先在rslinx上把plc的点导出为opc server 2.使用opc power tool 作为opc client 去连接 3.保存到项目的PDB文件夹下面,并且以节点名命名。 也可以不以节点名命名,系统自动会生成一个以节点名命名的这种文件,就显得很乱。 同时,项目的PDB目录下面必须还得拷过来一个de...

中国智造2025 4114

Code Composer Studio 8.3.1安装与常见问题解决指南

本文提供了Code Composer Studio 8.3.1版本的详细安装指南与常见问题解决方案。内容涵盖从下载离线安装包、系统环境准备、自定义安装步骤,到首次启动配置及汉化建议。重点解析了安装过程中可能遇到的闪退、卡顿、Java虚拟机错误等典型问题的排查与修复方法,旨在帮助开发者高效部署这一稳定的嵌入式集成开发环境。

weixin_29195217的博客 330

基于开源 Openfire 聊天服务器 - 开发Openfire聊天记录插件

基于开源 Openfire 聊天服务器 - 开发Openfire聊天记录插件 上一篇文章介绍到怎么在自己的Java环境中搭建openfire插件开发的环境,同时介绍到怎样一步步简单的开发openfire插件。一步步很详细的介绍到简单插件开发,带Servlet的插件的开发、带JSP页面插件的开发,以及怎么样将开发好的插件打包、部署到openfire服务器。   如果你没有看上一篇文章的

p312011150的博客 719

PotPlayer播放4K HDR电影时,如何正确设置LAV解码器与MadVR渲染器避免色彩失真?

本文详细介绍了如何在PotPlayer中正确配置LAV解码器与MadVR渲染器,以解决播放4K HDR电影时的色彩失真问题。从组件安装、参数设置到显卡协同配置,提供了一套完整的端到端解决方案,帮助影音爱好者获得最佳的视觉体验。

weixin_28732953的博客 440

基于开源 Openfire 聊天服务器 - 开发Openfire 聊天记录插件

转http://blog.youkuaiyun.com/ibm_hoojo/article/details/8736341 上一篇文章介绍到怎么在自己的Java环境中搭建openfire插件开发的环境,同时介绍到怎样一步步简单的开发openfire插件。一步步很详细的介绍到简单插件开发,带Servlet的插件的开发、带JSP页面插件的开发,以及怎么样将开发好的插件打包、部署到openfire服务

fendou4533的专栏 1499

【GameFramework扩展应用】6-5、GameFramework框架出包时增加版本信息Version.txt文件

框架在热更新的时候,会先去获取文件,然后获取版本号,对比版本号和资源大小,才会开始下载资源。但是,框架生成AssetBundle资源的包里面是没有这个文件的,只能我们新建一个文件,然后手动填入数据,非常麻烦。好消息是,框架把这些接口都留给我们了,我们只需要继承接口,重写函数,然后在打包的时候选择这个辅助器即可。下面就来看一下如何实现把。

优快云博客专家,Unity3D高级软件工程师,《Unity 3D从入门到实战》作者。 1039

YOLOv11+BiFPN双向特征金字塔:全方位解析多尺度检测性能优化指南

飞书链接:https://ecn6838atsup.feishu.cn/wiki/EhRtwBe1CiqlSEkHGUwc5AP9nQe?购买即可解锁800+YOLO优化文章,并且还有海量深度学习复现项目,价格仅需两杯奶茶的钱,每日更新。函数中添加BiFPN的解析逻辑(找到。链接可用,不要多复制空格了。密码:946m22&8。

FJN110的博客 306

openfire:基于开源 Openfire 聊天服务器 - 开发Openfire聊天记录插件

基于开源 Openfire 聊天服务器 - 开发Openfire聊天记录插件 上一篇文章介绍到怎么在自己的Java环境中搭建openfire插件开发的环境,同时介绍到怎样一步步简单的开发openfire插件。一步步很详细的介绍到简单插件开发,带Servlet的插件的开发、带JSP页面插件的开发,以及怎么样将开发好的插件打包、部署到openfire服务器。 如果你没有看上一篇文章的话,请...

weixin_34346099的博客 151

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

基于开源 Openfire 聊天服务器 - 开发Openfire聊天记录插件[转]

上一篇文章介绍到怎么在自己的Java环境中搭建openfire插件开发的环境,同时介绍到怎样一步步简单的开发openfire插件。一步步很详细的介绍到简单插件开发,带Servlet的插件的开发、带JSP页面插件的开发,以及怎么样将开发好的插件打包、部署到openfire服务器。   如果你没有看上一篇文章的话,请你还是看看。http://www.cnblogs.com/hoojo/arch...

weixin_34234721的博客 106

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

基于开源 Openfire 聊天服务器 - 开发聊天记录插件

上一篇文章介绍到怎么在自己的Java环境中搭建openfire插件开发的环境,同时介绍到怎样一步步简单的开发 openfire插件。一步步很详细的介绍到简单插件开发,带Servlet的插件的开发、带JSP页面插件的开发,以及怎么样将开发好的插件打包、部署 到openfire服务器。   如果你没有看上一篇文章的话,请你还是看看。http://www.cnblogs.com/hoojo/...

行动起来 245

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

上一篇: android时间日期控件
下一篇: android单选按钮事件
青蛙小王子
博客等级 码龄16年 239粉丝 311原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值