资讯专栏INFORMATION COLUMN

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

CrazyCodes / 2534人阅读

摘要:大家明天一起去唱吧关于数据库设计当前一版不会固定大家的数据库设计,大家可以自己自由设计,同时搭上自己的项目,构建一个附带的自项目。

InChat 一个IM通讯框架

一个轻量级、高效率的支持多端(应用与硬件Iot)的异步网络应用通讯框架。(核心底层Netty)

Github:InChat

版本目标:完成基本的消息通讯(仅支持文本消息),离线消息存储,历史消息查询,一对一聊天、自我聊天、群聊等。

你可以使用InChat,快速搭建一个基于SpringBoot的IM项目,而且没有任何硬性要求,你完全可以兼容自己原有的项目。

v1.0.0版本使用说明 关于InChat的Maven依赖

fastjson 》 1.2.53

gson 》 2.8.5

netty 》 4.1.32.Final

commons-lang 》 3.5

aspectj 》 1.9.2

lombok 》 1.18.4

spring-boot 》 2.0.2.RELEASE

spring-boot-starter-websocket

关于一版依旧使用SpringBoot的环境,同时为应用注入了web环境,引入InChat依赖包后,对于SpringBoot相关的web可以无需引入,同时请注意相关版本的兼容性。
引入InChat默认可以自动运行web环境。

创建项目

创建一个空的Maven项目,并引入InChatMaven包,(注意,请不要使用与本项目相同的包目录)。

可能你只需要这样的Maven依赖即可


    
        com.github.UncleCatMySelf
        InChat
        1.0-alpha
    
    
        org.springframework.boot
        spring-boot-starter-test
        test
    
注入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的接口与实现

这次你仅需写两个实现接口即可啦!!!

@Service
public class ToDataBaseServiceImpl implements InChatToDataBaseService{

    @Override
    public Boolean writeMapToDB(Map maps) {
        //异步写入数据库
        System.out.println(maps.toString());
        return true;
    }
}

这个接口是每个人通讯的信息,InChat自带实现了异步的数据外抛得接口InChatToDataBaseService,目前一版只有一个方法,

就是上面得writeMapToDB,你仅需要map的内容转为对应的对象(一版还没提供对应的转换类,下一版对提供),并将数据存入自己喜欢的数据库中。
如果数据并发大,也可以先放到MQ中,再写入数据库。

@Service
public 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中的登录按钮对应的js

function 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中的登录按钮对应的js

function 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中的登录按钮对应的js

function 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中的登录按钮对应的js

function 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的自项目。
前端效果

发送人

接收人

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/72683.html

相关文章

  • 用Java构建一个简单WebSocket聊天项目之新增HTTP接口调度

    摘要:前言大家可以看看上一篇用构建一个简单的聊天室在上一篇文章中我们已经实现了自我对话好友交流群聊离线消息等的功能。系统通知恭喜您连续登录超过天,奖励积分。 本文首发公众号与个人博客:Java猫说 & 猫叔的博客 | MySelf,转载请申明出处。 前言 大家可以看看上一篇:用Java构建一个简单的WebSocket聊天室 在上一篇文章中我们已经实现了:自我对话、好友交流、群聊、离线消息等...

    vvpvvp 评论0 收藏0
  • 如何做一个自己开源聊天项目?(仿微信)

    摘要:一个轻量级高效率的支持聊天与物联网的通讯框架从月初到现在已经大约已经三个月了,由于一直没有时间与精力很好的维护这个项目,心里一直有所歉意。希望本项目对你有所帮助,我的目标暂定,一个小众加物联网的开源通讯项目。 篇幅较长,感谢阅读。 万事开头难 在我决定做开源是因为自身工作接触到大多数的项目都是基于开源大佬写的框架,自觉惭愧,工作以来一直忙于业务与功能实现,多多少少做过的几个项目也没能抽...

    Zachary 评论0 收藏0
  • 你所不知道直播平台IM系统搭建全攻略 | 恺英网络张皓聪分享

    摘要:恺英网络程序经理张皓聪在上,做了直播平台系统实战的主题分享,介绍了直播平台系统的搭建过程。张皓聪年加入恺英网络,先后负责过多款手游页游项目,对和有深入研究。确保所有的压力是平均的。 分享 | 张皓聪(恺英网络程序经理) 整理 | 西北 2016年10月29日,由又拍云举办的Open Talk No.26在魔都上海3W空间成功举办,此次活动主要邀请直播领域开发一线的技术大神们聊一聊直播平...

    kycool 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<