关于聊天:Android实现实时视频聊天功能|源码-Demo-分享

疫情期间,很多线下流动转为线上举办,实时音视频的需要剧增,在视频会议,在线教育,电商购物等泛滥场景成了“生存新常态”。 本文将教你如何通过即构ZEGO 音视频 SDK 在Android端搭建实时视频通话能力。即构音视频SDK提供100+种行业解决方案,RTC 每月赠送10000分钟收费时长,提供收费RTC SDK 接入体验。 接下来咱们看看残缺的Android实时视频聊天实现流程。 1 Android端音视频SDK筹备环境在开始集成 ZEGO Express SDK 前,请确保开发环境满足以下要求: Android Studio 2020.3.1 或以上版本。 Android SDK 25、Android SDK Build-Tools 25.0.2、Android SDK Platform-Tools 25.x.x 或以上版本。 Android 4.4 或以上版本,且反对音视频的 Android 设施。 Android 设施曾经连贯到 Internet。 2 实时音视频我的项目筹备2.1 创立实时音视频我的项目进入即构官网,在【ZEGO控制台】创立我的项目,并申请无效的 AppID,这一步很要害,appid为利用的惟一标识,如身份证号,是利用的身份证明,用于明确你的我的项目及组织身份。zego 音视频云 提供的服务也是基于APP ID; App ID的获取形式很简略,只需3~5分钟,在即构官网-我的我的项目-创立即可。创立的我的项目信息可用于音视频 SDK的集成和配置; 2.2 Token 鉴权登录房间时必须 应用 Token 鉴权 ,可参考 Token 鉴权教程。 为了不便开发阶段的调试,开发者可间接在 ZEGO 控制台获取长期 Token(有效期为 24 小时) 来应用,详情请参考  控制台(新版) - 项目管理中的 “我的项目信息”。 ...

August 9, 2022 · 4 min · jiezi

怎么恢复微信聊天记录简单方法教你恢复

怎么恢复微信聊天记录?经常使用微信的小伙伴都会遇到这样的问题,不过会解决这个问题的不多,其实想要恢复聊天记录也不是很难,但是一般微信里面都会有很多重要的聊天记录,删除了都想要将聊天记录恢复回来,当我们手机聊天记录删除了怎么办?怎么恢复微信聊天记录? 一:从电脑上恢复 很多经常使用电脑的用户就可以用这个方法来对手机删除的微信聊天记录恢复,电脑上登录微信后在设置中可以看到备份与恢复功能,备份过里面的聊天记录就可以通过【恢复聊天记录至手机】将备份的聊天记录恢复到手机上。 二:从手机上恢复 从手机上也可以恢复,不过只能恢复因微信系统等现象导致的聊天记录删除的情况。打开微信设置找到【帮助与反馈】进入之后右上角的扳手图标点击,跳转到微信修复工具界面,然后选择修复聊天记录就会尝试修复删除的聊天记录了。 三:电脑软件恢复 在电脑上找到电脑软件恢复聊天记录,从电脑中找到【互盾安卓恢复大师】获取到电脑上后将删除聊天记录的手机连接到电脑上,使用软件的“一键恢复”功能的快速扫描功能对手机中的数据扫描。 随后只需等待软件扫描完成之后就可以从软件的界面中看到已经扫描出来的数据了,从这些数据中就可以看到微信一栏,点击看到手机登录过的账号,选择删除聊天记录的账号选择需要查看详情,选择需要的聊天记录使用“恢复选中文件”恢复即可。 怎么恢复微信聊天记录?根据上述方法就能简单恢复聊天记录了,其实想要恢复还是很简单的,不过还是要提示一下在手机上重要的数据要做好备份的操作。

October 17, 2019 · 1 min · jiezi

如何恢复微信删除的聊天记录简单方法学习

如何恢复微信删除的聊天记录?在使用微信的时候都会遇到这样的问题,有时候在使用微信的时候会看到里面的聊天记录内容太多,想去删掉一些,可没曾想里面的聊天记录还有一些重要的那么当我们想要找回删除的微信聊天记录该怎么办呢?如何恢复微信删除的聊天记录? 一:帮助与反馈 在微信的设置中有个“帮助与反馈”的功能,可以通过这个功能来对删除的聊天记录进行恢复,不过该功能只适用于手机系统故障(升级、闪退等)造成的聊天记录删除进行恢复。在设置中找到帮助与反馈,按如图所示操作。 二:微信备份恢复 电脑上登录微信可以看到有备份与恢复的功能,使用电脑微信时可以将聊天记录备份到里面,当我们手机上的聊天记录删除了就可以将备份的聊天记录恢复到手机上。选择备份与恢复的恢复功能选择需要恢复的聊天记录恢复到手机里面。 三:电脑软件恢复 找到电脑软件来恢复聊天记录,在电脑的浏览器中找到【互盾苹果恢复精灵】并且获取到电脑上,然后将手机连接到电脑上,使用软件的“从iPhone设备扫描恢复”功能对手机中的数据进行扫描。 待软件扫描完成之后就可以在软件的界面上看到已经扫描出来的数据了,点击微信一栏可以看到手机登录过的微信,选择删除聊天记录的微信查看记录,从里面选择需要恢复的聊天记录利用“导出选中记录”恢复聊天记录。 如何恢复微信删除的聊天记录?根据以上的简单方法就可以轻松恢复了,在手机中有很多重要的数据一定要记得备份,选中一个正确方法可以快速恢复聊天记录。

October 14, 2019 · 1 min · jiezi

微信删除聊天记录怎么找回全反面教你恢复

微信删除聊天记录怎么找回?我们在使用微信的时候都会遇到这样的一个问题,当我们在查看聊天记录是会发现有些记录不在手机中,那么这种可能是将里面的聊天记录删除了,但是如果想要将聊天记录恢复回来该怎么做?这个时候我们该怎么去解决呢?微信删除聊天记录怎么找回? 一:recover修复 这种方法一般在微信使用过程中发生如聊天记录混乱等异常情况,当微信中 出现聊天记录混乱导致删除了聊天记录就可以通过recover恢复。打开微信在顶端搜索框中输入“recover”会有一个修复工具进入之后选择“修复工具”进入之后点击“聊天记录”等待修复完成即可。 二:电脑微信恢复 有时候经常会使用到电脑来登录微信聊天,所以会在电脑上留存很多的聊天记录在里面,有时候会去备份聊天记录,登录时会提示同步消息内容。 要恢复删除的聊天记录登录电脑微信之后的界面的左下角中找到“备份与恢复”功能,点击选择恢复聊天记录从里面的内容中勾选需要恢复的聊天记录恢复到手机中即可。 三:电脑软件恢复 从电脑上找到恢复软件可以恢复聊天记录,在电脑浏览器中找到【互盾苹果恢复精灵】并且获取到电脑中,然后将手机连接到电脑上之后使用“从iPhone设备扫描恢复”功能对手机中的数据进行扫描。 待软件扫描完成之后可以在软件的界面中看到扫描出来的数据了,点击“微信”一栏可以看到手机登录过的微信号,选择需要恢复聊天记录的账号之后查看详情,找到需要的聊天记录勾选中使用“导出选中记录”恢复。 微信删除聊天记录怎么找回?根据以上的方法可以将聊天记录恢复了,虽然不能百分百恢复聊天记录但是效果还是很不错的,删除时间短恢复几率越高。

October 9, 2019 · 1 min · jiezi

微信聊天记录删除怎么恢复这样做太简单了

微信聊天记录删除怎么恢复?在微信上困扰大家的原因只有一个,就是微信上面的聊天记录如果被删除了该怎么办?很多人经常会遇到这样的问题,有时候在查找聊天记录的时候会发现有些聊天记录被删除了,当我们发现聊天记录被删除时怎么办?微信聊天记录删除怎么恢复? 一:异常修复 有些时候可能会因为微信异常或者是卡顿导致微信里面的聊天记录删除那么就可以通过这个方法来将手机里面的聊天记录恢复。打开手机微信,点击设置-帮助与反馈-快捷帮助-异常修复,选择要修复的功能即可,这样就能恢复聊天记录了。 二:电脑微信恢复 很多人都会使用到电脑登录微信,当然这是对于一些长期在电脑上使用微信的小伙伴,聊天记录会存在电脑的微信里面,从里面的内容中找到聊天记录并且将其恢复到手机中。打开电脑端微信,在“备份与恢复”页面选择“恢复聊天记录至手机”,勾选需要的数据恢复即可。 三:电脑软件恢复 找到电脑软件对删除的聊天记录恢复,电脑的浏览器中找到【互盾安卓恢复大师】通过这个软件恢复聊天记录,手机连接到电脑使用软件的“一键恢复”功能的快速扫描对手机中的数据进行扫描。 待软件扫描完成手机之后就可以在软件中看到扫描出来的数据了,点击界面的“微信”一栏从里面选择自己的微信号查看详情,并且在里面找到需要恢复的聊天记录之后使用软件的“恢复选择文件”将聊天记录恢复。 微信聊天记录删除怎么恢复?根据以上方法就可以轻松恢复聊天记录了,有需要的小伙伴可以根据实际情况使用方法恢复,选择正确的方式可以快速恢复。

September 19, 2019 · 1 min · jiezi

微信聊天记录怎么恢复到手机超实用的简单方法恢复

微信聊天记录怎么恢复到手机?我们经常都会使用到微信,不管是工作中还是在生活中都会使用到微信,在日积月累的情况下我们会有很多的聊天记录存在,当我们不小心删除了聊天记录该怎么办?微信聊天记录怎么恢复到手机?接下来就了解一下微信聊天记录怎么恢复吧! 其实恢复聊天记录也不算太难也不会太简单。不过需要注意这几点。 1.在微信里面尽量不要产生新的数据,也就是不要使用微信聊天。微信产生新的聊天会将里面删除的数据覆盖在此期间就不要怎么使用微信,否则那就找不回来了。 2.也不要卸载微信或者升级微信,会导致之前的数据被清空,这样就无法进行恢复了,除非事先有备份。 3.尽快做好手机数据备份,将手机中的数据备份到电脑上可以有效防止数据的丢失。 一、微信功能恢复 如果是要恢复已经备份过的聊天记录,那么直需要在电脑上运行 登录微信账号,然后点击左下角的按键,选择【备份与恢复】,再点击【恢复聊天记录至手机】,然后选择需要恢复的聊天记录这样就可以将备份的微信聊天记录重新恢复到手机上。 二:聊天记录迁移 如果你曾经把iPhone的微信聊天记录迁移到另一部手机进行备份,那么我们就还是可以把聊天记录迁移回原来的手机,进行恢复。恢复:登录微信后进入“设置”界面--通用--迁移聊天记录--选择相关的记录进行迁移。 三、数据恢复软件恢复微信聊天记录 找到恢复软件对微信聊天记录恢复找出并且进行恢复,在电脑上找到【互盾安卓恢复大师】借助这个软件恢复聊天记录即可,手机连接到电脑上之后使用软件的“一键恢复”功能对手机里面的聊天记录扫描。 软件扫描完成之后就可以在软件的界面上看到已经扫描出来的数据了,从这些数据中可以看到微信一栏,点击需要恢复聊天记录的账号查看详情,选择需要恢复的聊天记录进行勾选中使用“恢复选中文件” 这是使用工具恢复安卓手机删除的微信聊天记录, 注:这是利用微信软件自带的功能进行恢复,同样适用于安卓手机。 通过以上的方法就可以将删除的微信聊天记录进行恢复了,在手机中有很多重要的数据这些数据都是可以进行备份的,有备份就不怕删除无法恢复。

September 6, 2019 · 1 min · jiezi

SSL加密与分布式IM系统-InChat1.1.3版本试用说明

本文首发于本博客 猫叔的博客,转载请申明出处2019年1月15号-InChat发布V1.1.3版本InChat一个轻量级、高效率的支持多端(应用与硬件Iot)的异步网络应用通讯框架v1.1.3版本使用说明v1.1.0-alpha版本使用说明InChatV1.1.2版本使用说明历史更新说明1.1.2版本捕获未注册链接断开异常,完善异常处理修改项目启动流程,仿Selector启动模式添加HTTP接口三个:发送通知消息,获取在线用户数,获取在线用户列表,暂不支持用户自定义HTTP接口(对于传统web API我们希望用户用自己的框架与流程)服务端发送通知接口改为enum处理1.1.3版本添加SSL加密,实现https与wss功能接受用户自定义证书(浏览器信任与不信任均可以访问)InChat配置可改为分布式或着单机版引入Redis,处理集群信息与消息互通如果有生产需要或者个别需求,发现BUG,欢迎留言,项目会更新新的API关于InChat的Maven依赖fastjson 》 1.2.53gson 》 2.8.5netty 》 4.1.32.Finalcommons-lang 》 3.5slf4j-log4j12 》 1.7.25jedis 》 3.0.1创建项目创建一个空的Maven项目,并引入InChatMaven包,(注意,请不要使用与本项目相同的包目录)。可能你只需要这样的Maven依赖即可<dependencies> <dependency> <groupId>com.github.UncleCatMySelf</groupId> <artifactId>InChat</artifactId> <version>1.1.3</version> </dependency></dependencies>对接InChat的接口与实现InChat启动参数可以自配置你只需要继承InChat的默认配置类InitNetty即可,如下public class MyInit extends InitNetty { /** 自定义启动监听端口 / @Override public int getWebport() { return 8090; } /* 是否启动分布式 true-启动、false-不启动 / @Override public Boolean getDistributed() { return true; } /* 是否启动加密功能 */ @Override public boolean isSsl() { return true; }}请注意,分布式为测试版,所以暂不支持SSL加密,如果启动分布式请关闭SSL加密功能如何自定义证书?#keytool -genkey -keysize 2048 -validity 365 -keyalg RSA -dnam e “CN=in-chat.cn” -keypass 123456 -storepass 123456 -keystore inchat.jkskeytool为JDK提供的生成证书工具keysize 2048 密钥长度2048位(这个长度的密钥目前可认为无法被暴力破解)validity 365 证书有效期365天keyalg RSA 使用RSA非对称加密算法dname “CN=gornix.com” 设置Common Name为gornix.com,这是我的域名keypass 654321 密钥的访问密码为123456storepass 123456 密钥库的访问密码为123456(其实这两个密码也可以设置一样,通常都设置一样,方便记)keystore gornix.jks 指定生成的密钥库文件为inchat.jks如果你试着自己创建了自己的证书,那么你需要去重写InitNetty中的几个信息:jksFile,jksStorePassword,jksCertificatePassword。你的jks文件只需要放到resources目录下就好,两个密码就是你之前设定相同的密码。本项目已经提供了默认的inchat.jks,请用户在Maven包中复制并粘贴到自己的项目中的resources文件夹中即可。获取聊天消息数据此接口与原先一样,仅修改了方法名public class DataBaseServiceImpl implements InChatToDataBaseService { @Override public Boolean writeMessage(InChatMessage message) { System.out.println(message.toString()); return true; }}登录校验与群聊消息此接口没有做过多的修改public class VerifyServiceImpl implements InChatVerifyService { @Override public boolean verifyToken(String token) { return true; } @Override public JSONArray getArrayByGroupId(String groupId) { JSONArray jsonArray = JSONArray.parseArray("["1111","2222","3333"]"); return jsonArray; }}服务端发送通知消息枚举类此接口具有Demo模板,用户需要继承InChat框架的FromServerService接口,同时该接口注释也有实例demo,我们需要实现一个自定义的枚举,你可以这样写:public enum FromServerServiceImpl implements FromServerService { //你可以自定义自己的系统消息,请以Integer-String的形式 TYPE1(1,"【系统通知】您的账号存在异常,请注意安全保密信息。"), TYPE2(2,"【系统通知】恭喜您连续登录超过5天,奖励5积分。"); private Integer code; private String message; FromServerServiceImpl(Integer code, String message){ this.code = code; this.message = message; } public Integer getCode() { return code; } //实现接口的方法,遍历本枚举的code,获取对应的消息,作为系统消息发送 public String findByCode(Object code) { Integer codes = (Integer)code; for (FromServerServiceImpl item: FromServerServiceImpl.values()) { if (item.code == codes){ return item.message; } } return null; } public void setCode(Integer code) { this.code = code; } public String getMessage() { return message; } public void setMessage(String message) { this.message = message; }}启动项目1.1.3版本的启动项目变得异常的简单,你只需要配置启动的配置工厂即可。但是如果我们启动了分布式的话,我们还需要配置redis信息。public class application { public static void main(String[] args) { //配置你的自定义配置 ConfigFactory.initNetty = new MyInit(); //配置校验类 ConfigFactory.inChatVerifyService = new VerifyServiceImpl(); //配置消息接收处理类 ConfigFactory.inChatToDataBaseService = new DataBaseServiceImpl(); //配置服务端系统消息枚举,这里的值无所谓 TYPE1或者TYPE2或者TYPEN均可以 ConfigFactory.fromServerService = FromServerServiceImpl.TYPE1; //配置分布式Redis地址,端口目前默认的,下一版可以支持修改。 ConfigFactory.RedisIP = “192.168.192.132”; //启动InChat InitServer.open(); }}项目效果启动成功DEBUG - -Dio.netty.threadLocalDirectBufferSize: 0DEBUG - -Dio.netty.maxThreadLocalCharBufferSize: 16384 INFO - 服务端启动成功【192.168.56.1:8090】 INFO - [RedisConfig.getJedis]:连接成功,测试连接PING->PONG如果你开通了分布式,那么你可以试着启动两个应用程序。DEBUG - -Dio.netty.threadLocalDirectBufferSize: 0DEBUG - -Dio.netty.maxThreadLocalCharBufferSize: 16384 INFO - 服务端启动成功【192.168.56.1:8070】 INFO - [RedisConfig.getJedis]:连接成功,测试连接PING->PONG读者可以到项目中使用原来的两个前端页面。分别登录两个用户在两个应用程序,并进行互相通信即可。启动分布式请关闭SSL,分布式为测试版,暂不支持SSL目前,分布式版本接通了点对点与群聊的功能,大家可以试试。下一版本会添加一个分布式的组件用来统一数据与接口功能。关于加密的,请提前让电脑认同信任证书关于分布式的操作效果关于HTTP接口的,目前与分布式无关原先的自我发送,点对点发送,群聊,异常处理,HTTP接口均与原来一样原先的接口说明可以看上一版本: InChatV1.1.2版本使用说明前端相关这里你可以来到InChat的Front-End-Testing文档夹中的chat.html。你可以直接使用,你进需要修改对应的对接IP即可。如果你开了SSL加密,你的IP开头记得改为:wss://192.168.1.121:8090/ws !!!前端可以看原来的版本: InChatV1.1.2版本使用说明关于数据库设计当前一版不会固定大家的数据库设计,大家可以自己自由设计,同时搭上自己的项目,构建一个附带IM的自项目。公众号:Java猫说现架构设计(码农)兼创业技术顾问,不羁平庸,热爱开源,杂谈程序人生与不定期干货。 ...

January 15, 2019 · 2 min · jiezi

h5语音聊天audio实战|仿微信语音效果|h5即时聊天系统

最近一段时间不是那么忙,就抽空整理了下之前的项目,因为之前有开发过H5聊天项目,只是觉得好些功能都没有特别的完善,所以就把之前项目重新开发了下,如是就有了这个html5版实时聊天语音项目weChatIM系统。依旧使用的是h5+css3+jquery+wcPop+swiper+weScroll等技术架构开发,新增了上拉刷新加载数据,右键长按菜单弹窗、仿微信语音效果(按住说话,上滑取消发送)及地图定位功能。// >>> 【按住说话核心模块】——————————————// …按住说话var _voiceObj = $(".J__wdtVoice"), eY1 = 0, eY2 = 0, eY3 = 0, isDrag = true;var voiceIdx;var difftime = 0;function initVoice(){ _voiceObj.on(“touchstart”, function(e){ difftime = new Date(); if(!isDrag) return; isDrag = false; eY1 = e.originalEvent.targetTouches[0].pageY; _voiceObj.text(“松开 结束”); // 弹窗提示 voiceIdx = wcPop({ id: ‘wdtVoice’, skin: ’toast’, content: ‘<div style=“margin-top:-10px;"><i class=“iconfont icon-yuyin” style=“font-size:65px;"></i><div style=“line-height:32px;">手指上滑,取消发送</div></div>’, style: ‘border-radius:6px;height: 160px; width:160px;’, time: 10, opacity: 0, }); _voiceObj.on(“touchmove”, function (e) { e.preventDefault(); eY3 = e.originalEvent.targetTouches[0].pageY; if(eY1 - eY3 < 150){ _voiceObj.text(“松开 结束”); }else{ _voiceObj.text(“松开手指,取消发送”); // 弹窗提示 $("#wdtVoice .popui__panel-cnt”).html(’<div style=“margin-top:-10px;"><i class=“iconfont icon-quxiao” style=“font-size:65px;"></i><div style=“background:#c53838; border-radius:3px; line-height:32px;">松开手指,取消发送</div></div>’); } }); }); _voiceObj.on(“touchend”, function (e) { e.preventDefault(); eY2 = e.originalEvent.changedTouches[0].pageY; _voiceObj.text(“按住 说话”); // 录音时间太短提示 if(new Date() - difftime < 1000){ // 弹窗提示 $("#wdtVoice .popui__panel-cnt”).html(’<div style=“margin-top:-10px;"><i class=“iconfont icon-gantan” style=“font-size:65px;"></i><div style=“line-height:32px;">录音时间太短!</div></div>’); } else{ if (eY1 - eY2 < 150) { // 发送成功 submitData(); console.log(“测试数据”); } else { // 取消发送 console.log(“cancel”); } } // 关闭弹窗 setTimeout(function(){ wcPop.close(voiceIdx); }, 500); isDrag = true; });}// >>> 【摇一摇加好友核心模块】——————————————// 摇一摇加好友弹窗$("#J__popScreen_shake”).on(“click”, function () { var shakePopIdx = wcPop({ id: ‘wcim_shake_fullscreen’, skin: ‘fullscreen’, title: ‘摇一摇’, content: $("#J__popupTmpl-shakeFriends”).html(), position: ‘right’, xclose: true, style: ‘background: #303030;’, show: function(){ // 摇一摇功能 var _shake = new Shake({threshold: 15}); _shake.start(); window.addEventListener(“shake”, function(){ window.navigator.vibrate && navigator.vibrate(500); // console.log(“触发摇一摇!”); $(".J__shakeInfoBox”).html(””); $(".J__shakeLoading”).fadeIn(300); // 消息模板 var shakeTpl = [ ‘<div class=“shake-info flexbox flex-alignc”>\ <img class=“uimg” src=“img/uimg/u__chat-img08.jpg” />\ <div class=“flex1”>\ <h2 class=“name”>大幂幂<i class=“iconfont icon-nv c-f37e7d”></i></h2>\ <label class=“lbl clamp1”>开森每一刻,每天都要美美哒!</label>\ </div>\ </div>’ ].join(”"); setTimeout(function(){ $(".J__shakeLoading").fadeOut(300); $(".J__shakeInfoBox").html(shakeTpl); }, 1500); }, false); } });});// 切换摇一摇项目$(“body”).on(“click”, “.J__swtShakeItem a”, function(){ $(this).addClass(“active”).siblings().removeClass(“active”);});// 摇一摇设置$(“body”).on(“click”, “.J__shakeSetting”, function(){ wcPop({ skin: ‘actionsheetMini’, anim: ‘footer’, btns: [ { text: ‘<div class=“flexbox flex-alignc”><span class=“flex1”>是否开启震动</span> <span class=“rpr-30”><input class=“cp__checkboxPX-switch” type=“checkbox” checked /></span></div>’ }, { text: ‘摇到的历史’ }, ] });});欢迎大家一起交流、学习 Q:282310962 wx:xy190310 ...

December 23, 2018 · 2 min · jiezi

h5仿钉钉实战|仿钉钉聊天|仿钉钉模板界面

html5仿钉钉聊天weDingTalk微钉|h5钉聊系统|仿钉钉界面基于web端h5+css3+Zepto+jquery+swiper+wcPop等技术开发的仿钉钉移动办公系统,仿钉钉聊天界面模板,实现了类似钉钉聊天界面,发送消息、表情,预览图片、视频,发送红包,右键长按菜单等功能。][3]// 发送信息function isEmpty() { var html = $editor.html(); html = html.replace(/<br[\s/]{0,2}>/ig, “\r\n”); html = html.replace(/<[^img].*?>/ig, “”); html = html.replace(/&nbsp;/ig, “”); return html.replace(/\r\n|\n|\r/, “”).replace(/(?:^[ \t\n\r]+)|(?:[ \t\n\r]+$)/g, “”) == “”;}$(".J__wchatSubmit").on(“click”, function () { // 判断内容是否为空 if (isEmpty()) return; var _html = $editor.html(); var reg = /(http://|https://)((\w|=|?|.|/|&|-)+)/g; _html = _html.replace(reg, “<a href=’$1$2’ target=’_blank’>$1$2</a>”); var msgTpl = [ ‘<li class=“me”>\ <div class=“content”>\ <p class=“author”>风铃子</p>\ <div class=“msg”>’+ _html +’</div>\ </div>\ <a class=“avatar” href=“微钉-好友主页(详细资料).html”><img src=“img/uimg/u__chat-img07.jpg” /></a>\ </li>’ ].join(""); $chatMsgList.append(msgTpl); // 清空聊天框并获取焦点(处理输入法和表情 - 聚焦) if (!$(".wdt__choose-panel").is(":hidden")) { $editor.html(""); } else { $editor.html("").focus(); } wchat_ToBottom();});// >>> 【工具栏选择功能模块】——————————————// …选择图片$("#J__choosePicture").on(“change”, function () { $(".wdt__choose-panel").hide(); var file = this.files[0]; var reader = new FileReader(); reader.readAsDataURL(file); reader.onload = function (e) { var _img = this.result; var _tpl = [ ‘<li class=“me”>\ <div class=“content”>\ <p class=“author”>风铃子</p>\ <div class=“msg picture”><img class=“img__pic” src="’+ _img +’" /></div>\ </div>\ <a class=“avatar” href=“微钉-好友主页(详细资料).html”><img src=“img/uimg/u__chat-img07.jpg” /></a>\ </li>’ ].join(""); $chatMsgList.append(_tpl); setTimeout(function(){wchat_ToBottom();}, 17); }});// …选择文件$("#J__chooseFile").on(“change”, function () { $(".wdt__choose-panel").hide(); var file = this.files[0], fileSuffix = /.[^*]+/.exec(file.name).toString(), fileExt = fileSuffix.substr(fileSuffix.lastIndexOf(’.’) + 1, fileSuffix.length).toLowerCase(); console.log(fileSuffix); console.log(fileExt); var fileTypeArr = [‘jpg’, ‘jpeg’, ‘png’, ‘gif’, ’txt’, ‘rar’, ‘zip’, ‘pdf’, ‘docx’, ‘xls’]; if ($.inArray(fileExt, fileTypeArr) < 0) { wcPop({content: ‘附件只支持jpg、jpeg、png、gif、txt、rar、zip、pdf、docx、xls格式的文件’, time: 2}); return; } var reader = new FileReader(); reader.readAsDataURL(file); reader.onload = function (e) { var _file = this.result; console.log(_file); var _tpl = [ ‘<li class= “me”>\ <div class=“content”>\ <p class=“author”>风铃子</p>\ <div class=“msg attachment”>\ <div class=“card flexbox flex-alignc”>\ <span class=“ico-bg wdt__bg01”><i class=“iconfont icon-fujian”></i></span>\ <div class=“file-info flex1” title="’+ file.name +’">\ <p class=“name”>’+ file.name +’</p><p class=“size”>’+ formateSize(file.size) +’</p>\ </div>\ <a class=“btn-down” href="’+ _file +’" target="_blank" download="’+ file.name +’"><i class=“iconfont icon-down”></i></a>\ </div>\ </div>\ </div>\ <a class=“avatar” href=“微钉-好友主页(详细资料).html”><img src=“img/uimg/u__chat-img07.jpg” /></a>\ </li>’ ].join(""); $chatMsgList.append(_tpl); setTimeout(function () {wchat_ToBottom();}, 17); } /** 格式化文件大小显示 value : file文件的大小值 */ formateSize = function (value) { if (null == value || value == ‘’) { return “0 Bytes”; } var unitArr = new Array(“B”, “KB”, “MB”, “GB”, “TB”, “PB”, “EB”, “ZB”, “YB”); var index = 0; var srcsize = parseFloat(value); index = Math.floor(Math.log(srcsize) / Math.log(1024)); var size = srcsize / Math.pow(1024, index); size = size.toFixed(2); //保留的小数位数 return size + unitArr[index]; }}); ...

December 19, 2018 · 2 min · jiezi

InChat一版,仅仅两个接口实现自己的IM系统(可兼容)

InChat 一个IM通讯框架一个轻量级、高效率的支持多端(应用与硬件Iot)的异步网络应用通讯框架。(核心底层Netty)Github:InChat版本目标:完成基本的消息通讯(仅支持文本消息),离线消息存储,历史消息查询,一对一聊天、自我聊天、群聊等。你可以使用InChat,快速搭建一个基于SpringBoot的IM项目,而且没有任何硬性要求,你完全可以兼容自己原有的项目。v1.0.0版本使用说明关于InChat的Maven依赖fastjson 》 1.2.53gson 》 2.8.5netty 》 4.1.32.Finalcommons-lang 》 3.5aspectj 》 1.9.2lombok 》 1.18.4spring-boot 》 2.0.2.RELEASEspring-boot-starter-websocket关于一版依旧使用SpringBoot的环境,同时为应用注入了web环境,引入InChat依赖包后,对于SpringBoot相关的web可以无需引入,同时请注意相关版本的兼容性。引入InChat默认可以自动运行web环境。创建项目创建一个空的Maven项目,并引入InChatMaven包,(注意,请不要使用与本项目相同的包目录)。可能你只需要这样的Maven依赖即可<dependencies> <dependency> <groupId>com.github.UncleCatMySelf</groupId> <artifactId>InChat</artifactId> <version>1.0-alpha</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency></dependencies>注入InChat的项目到自身项目中你可能需要在你的项目上进行报扫描@SpringBootApplication@ComponentScan({“com.inchat”}) //你的demo包目录@ComponentScan({“com.github.unclecatmyself”}) //InChat的包目录 –请将InChat的放到最下面public class DemoApplication { public static void main(String[] args) { SpringApplication.run(DemoApplication.class, args); }}对接InChat的接口与实现这次你仅需写两个实现接口即可啦!!!@Servicepublic class ToDataBaseServiceImpl implements InChatToDataBaseService{ @Override public Boolean writeMapToDB(Map<String, Object> maps) { //异步写入数据库 System.out.println(maps.toString()); return true; }}这个接口是每个人通讯的信息,InChat自带实现了异步的数据外抛得接口InChatToDataBaseService,目前一版只有一个方法,就是上面得writeMapToDB,你仅需要map的内容转为对应的对象(一版还没提供对应的转换类,下一版对提供),并将数据存入自己喜欢的数据库中。如果数据并发大,也可以先放到MQ中,再写入数据库。@Servicepublic class verifyServiceImpl implements InChatVerifyService { @Override public boolean verifyToken(String token) { //登录校验 return true; } @Override public JSONArray getArrayByGroupId(String groupId) { //根据群聊id获取对应的群聊人员ID JSONArray jsonArray = JSONArray.parseArray("["1111","2222","3333"]"); return jsonArray; }}这个接口是InChat的校验层实现,对于Token的校验就是,verifyToken,websocket链接的时候,你将在初次做登录校验,你可以将从InChat拿到的websocket传过来的Token,你可以与自己的用户登录的token做校验,返回true,则用户成功链接InChat。关于getArrayByGroupId,目前是否应该放在这个接口中还有待确定,不过目前一版暂时这样,你可以去数据库中查询对应的群聊id所对应的人员ID(或Token),并返回对应的JSONArray即可啦。自定义配置InChat参数这个你可以直接在application中按照自己的意思配置,不过你最好先了解netty启动项目接着启动项目即可啦当你看到这个日志就标志着Inchat搭建成功了!!!2018-12-14 10:29:09.269 INFO 4920 — [ BOSS_1] c.g.u.bootstrap.NettyBootstrapServer : 服务端启动成功【192.168.1.121:8090】关于前端这里你可以来到InChat的Front-End-Testing文档夹中的chat.html。你可以直接使用,你进需要修改对应的对接IP即可。关于前端的js暂时还是模板关于登录你会看到chat.html中的登录按钮对应的jsfunction send(value) { if (!window.WebSocket) { return; } if (socket.readyState == WebSocket.OPEN) { var message = { type: “login”, //与InChat对应的 不可修改 token: “1111” } socket.send(JSON.stringify(message)); } else { alert(“连接没有开启.”); }}本demo,默认登录的Token是“1111”,关于用户校验则直接返回true即可。登录成功,返回以下内容。(不需要显示给用户看){“success”:“true”,“type”:“login”}InChat不会有登录记录发送给自己你会看到chat.html中的登录按钮对应的jsfunction sendToMe(value) { if (!window.WebSocket) { return; } if (socket.readyState == WebSocket.OPEN) { var message = { type: “sendMe”, //与InChat对应的 不可修改 value: value, //发送的内容 token: “1111” //发送用户的token } socket.send(JSON.stringify(message)); } else { alert(“连接没有开启.”); }}发送成功,InChat返回内容.(你仅需将value显示到前端即可){“type”:“sendMe”,“value”:“发送给自己的内容”}InChat消息记录,你将在异步消息中接受到InChat传递给你的用户通讯消息,你可以进行对应的入库操作{“time”:“2018-12-14 10:56:24”,“type”:“sendMe”,“value”:“发送给自己的内容”,“token”:“1111”}发送给某人你会看到chat.html中的登录按钮对应的jsfunction sendToOne(value) { if (!window.WebSocket) { return; } if (socket.readyState == WebSocket.OPEN) { var message = { type : “sendTo”, //与InChat对应的 不可修改 token : “1111”, //发送用户Token value: value, //发送内容 one: “2222”, //接受用户Token(唯一标识) } socket.send(JSON.stringify(message)); } else { alert(“连接没有开启.”); }}发送成功,接受的用户是否登录,你都能接受到返回信息。(value应用于自己界面展示){“one”:“2222”,“type”:“sendTo”,“value”:“发送给朋友的内容”}但是用户那边就不一样了。登录正常在线。{“from”:“1111”,“type”:“sendTo”,“value”:“发送给朋友的内容”}离线接受不到信息InChat异步消息推送,你可以看到两种在线: {“one”:“2222”,“time”:“2018-12-14 11:01:36”,“type”:“sendTo”,“value”:“发送给朋友的内容”,“token”:“1111”}离线: {“one”:“2222”,“time”:“2018-12-14 10:59:04”,“on_online”:“2222”,“type”:“sendTo”,“value”:“发送给朋友的内容”,“token”:“1111”}如果出现用户发送给用户的状态是离线的,则会在消息多出on_online的字段,该字段的内容就是离线用户的Token,你可以针对性的数据入库,并在用户上线的时候,读写信息的时候,有一个未读消息的状态。发送群聊你会看到chat.html中的登录按钮对应的jsfunction sendGroup(value) { if (!window.WebSocket) { return; } if (socket.readyState == WebSocket.OPEN) { var message = { type: “sendGroup”, //与InChat对应的 不可修改 groupId: “2”, //群聊ID token: “1111”, //发送用户的Token value: value //发送的消息 } socket.send(JSON.stringify(message)); } else { alert(“连接没有开启.”); }}发送成功,本人将接受到消息{“groupId”:“2”,“from”:“1111”,“type”:“sendGroup”,“value”:“大家明天一起去唱K吧”}群组中有些人在线接受、离线不接受在线:{“groupId”:“2”,“from”:“1111”,“type”:“sendGroup”,“value”:“大家明天一起去唱K吧”}InChat异步消息入库,群组只会异步给你一个消息,你可以看到on_online中,3333用户是没有接受到信息的,所以你可以在他上线发送未读消息。{“groupId”:“2”,“time”:“2018-12-14 11:09:17”,“on_online”:[“3333”],“type”:“sendGroup”,“value”:“大家明天一起去唱K吧”,“token”:“1111”}关于数据库设计当前一版不会固定大家的数据库设计,大家可以自己自由设计,同时搭上自己的项目,构建一个附带IM的自项目。前端效果发送人接收人 ...

December 14, 2018 · 2 min · jiezi