delphi + redis 实现即时消息
<p>按客户的要求,开了软件自动升级功能,每次上传完升级包都要给客户那边的负责人发微信说一声。</p><p>有时人家搁会议室一待就是一上午,基本联系不上,想了下,反正搁会议室也是讨论这个软件,</p>
<p>干脆给开个提醒升级的功能就完了。</p>
<p>结合redis的pub/sub机制,加上无所不能的Delphi, 最终达到目的。</p>
<p><img src="https://img2020.cnblogs.com/blog/726748/202112/726748-20211214233117958-1289031363.png"></p>
<p>知道redis牛,但实际没咋用过,只是一知半解。刚好借机学习下。</p>
<p>下载安装包,https://github.com/MicrosoftArchive/redis/releases</p>
<p>一路next,安装完,中间有个默认添加到环境变量PATH中的勾,默认没勾,为了少出幺蛾子,也给打上了。</p>
<p>默认端口6379,查了下,这也算个彩蛋,原来大牛们玩梗都能玩的这么高级 ^_^</p>
<p><img src="https://img2020.cnblogs.com/blog/726748/202112/726748-20211214233602985-2070108972.png"></p>
<p> </p>
<p>敲完了代码,本以为能一次性通过,结果报TCP连接失败。</p>
<p>跟客户的网管哥们确认端口是开放了的,赶紧查了下资料,说是外网(非redis服务器本机)要建立连接,得改一下配置文件里的参数。</p>
<p>默认路径安装的话,配置文件搁这:</p>
<p><img src="https://img2020.cnblogs.com/blog/726748/202112/726748-20211214234212249-1572070249.png"></p>
<p>并且有俩,这是碰上的第一个坑,也就是上边安装时改了默认端口,用了哥们给开的指定的端口,</p>
<p>坑1: 只改了redis.windows.conf中的port, 重启了数次redis服务,就是不起效,</p>
<p>后来打开redis服务的属性一瞅,原来默认走的是下边那个配置文件</p>
<p><img src="https://img2020.cnblogs.com/blog/726748/202112/726748-20211214234523696-1774948038.png"></p>
<p>赶紧改完</p>
<p><img src="https://img2020.cnblogs.com/blog/726748/202112/726748-20211214234640302-1651725515.png"></p>
<p>结果还是不行,服务器本机没啥问题,自己的电脑就是连不了,再问度娘,填上坑2</p>
<p>坑2, 把这个bind注释掉就完了</p>
<p><img src="https://img2020.cnblogs.com/blog/726748/202112/726748-20211214234752990-1301259380.png"></p>
<p>继续坑3,因为用的是客户的云服务器,按资料上说的,为了安全,主要也是为了练手敲一下命令行,设置了密码:</p>
<p><img src="https://img2020.cnblogs.com/blog/726748/202112/726748-20211214235048066-1378906913.png"></p>
<p>结果中间因为其他原因重启redis服务,发现白瞎了。</p>
<p>还得是找度娘帮忙,大佬们的知乎给了解答,简单概括就是:<span style="color: rgba(255, 0, 0, 1)"><strong>通过命令行设置是临时的,要永久改还是得去改配置文件</strong></span>:</p>
<p><img src="https://img2020.cnblogs.com/blog/726748/202112/726748-20211214235309988-841840086.png"></p>
<p>自此,这算是实现了本次的目标。</p>
<p>To-Do:</p>
<p>1. 弹窗的按钮再扩展下,显示个头像啥的,体验能更好点;</p>
<p>2. 订阅消息的消息体再扩展下,因为A、B、C虽然都订阅了同一个频道,但是解析时一瞅这是人家A发给B的情书,C也就别厚着脸皮偷看了。</p>
<p>不知道这个思路合适不,但是既然说redis的I/O那么牛,再说目前这个内部用的软件的用户量目前就百十号人。这个应该算最皮毛的吧。</p>
<p>可行的话,这不就实现了软件内的通讯?想想挺美,之前用 TIdUDPServer 实现过类似功能,但是总觉复杂了点,不爽。</p>
<p>-----------------------------------------------------------------------------</p>
<p>继续坑4:后续实际使用过程中,客户反馈软件运行一段时间后,收不到消息。跟进发现是Socket连接断开。报错:</p>
<p><em><span style="color: rgba(255, 0, 0, 1)">Socket Error # 10053.Software caused connection abort. </span></em><span style="color: rgba(255, 0, 0, 1)"><span style="color: rgba(0, 0, 0, 1)">之类的。</span></span></p>
<p>看了篇介绍redis配置文件的公众号文章,发现了个参数,默认值是0,按说明设置为60,就可以了。</p>
<p><img src="https://img2022.cnblogs.com/blog/726748/202202/726748-20220220134816506-1926067588.png"></p>
<p>-----------------------------------------------------------------------------</p>
<p>按自己的思路,目前软件的(1)升级提醒、(2)内部通讯、(3)登录登出提醒及在线、离线列表、(4)在B客户端登录后自动把已在登录在A客户端的相同账号踢掉(强制下线),这些基本的功能都实现了一遍。目前看,客户那边实际的用户50+人,日常用着也没出啥问题。咋简单咋整吧。</p><br><br>
来源:https://www.cnblogs.com/mozzie/p/15690776.html
頁:
[1]