Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >InChatV1.1.0版本使用说明

InChatV1.1.0版本使用说明

作者头像
Java猫说
发布于 2019-04-11 02:07:56
发布于 2019-04-11 02:07:56
61400
代码可运行
举报
文章被收录于专栏:Java猫说Java猫说
运行总次数:0
代码可运行

GitHub项目地址

InChat

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

v1.1.0版本使用说明

视频教学地址

关于InChat的Maven依赖

  • fastjson 》 1.2.53
  • gson 》 2.8.5
  • netty 》 4.1.32.Final
  • commons-lang 》 3.5
  • lombok 》 1.18.4

创建项目

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

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<dependencies>
    <dependency>
        <groupId>com.github.UncleCatMySelf</groupId>
        <artifactId>InChat</artifactId>
        <version>1.1.0-alpha</version>
    </dependency>
</dependencies>

对接InChat的接口与实现

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class ToDataBaseServiceImpl implements InChatToDataBaseService{

    @Override
    public Boolean writeMapToDB(InChatMessage message) {
        System.out.println(message.toString());
        return true;
    }
}
  • 这个接口是每个人通讯的信息,InChat自带实现了异步的数据外抛得接口InChatToDataBaseService,目前一版只有一个方法, 就是上面得writeMapToDB。 如果数据并发大,也可以先放到MQ中,再写入数据库
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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即可啦。

启动项目

接着启动项目即可啦

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public static void main(String[] args) {
    //配置InChat配置工厂
    ConfigFactory.inChatToDataBaseService = new ToDataBaseServiceImpl();
    ConfigFactory.inChatVerifyService = new verifyServiceImpl();
    //默认启动InChat
    InitServer initServer = new InitServer(new InitNetty());
    initServer.open();

    //获取用户值
    WebSocketChannelService webSocketChannelService = new WebSocketChannelService();

    //启动新线程
    new Thread(new Runnable() {
        @Override
        public void run() {
            //设定默认服务器发送值
            Map<String,String> map = new HashMap<>();
            map.put("server","服务器");
            //获取控制台用户想发送的用户Token
            Scanner scanner = new Scanner(System.in);
            String token = scanner.nextLine();
            //获取用户连接
            Channel channel = (Channel) webSocketChannelService.getChannel(token);
            //调用接口发送
            webSocketChannelService.sendFromServer(channel,map);
        }
    }).start();
}

当你看到这个日志就标志着Inchat搭建成功了!!!

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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即可。

登录成功,返回以下内容。(不需要显示给用户看)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{"success":"true","type":"login"}

InChat不会有登录记录

发送给自己

你会看到chat.html中的登录按钮对应的js

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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显示到前端即可)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{"type":"sendMe","value":"发送给自己的内容"}

InChat消息记录,你将在异步消息中接受到InChat传递给你的用户通讯消息,你可以进行对应的入库操作

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{"time":"2018-12-14 10:56:24","type":"sendMe","value":"发送给自己的内容","token":"1111"}

发送给某人

你会看到chat.html中的登录按钮对应的js

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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应用于自己界面展示)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{"one":"2222","type":"sendTo","value":"发送给朋友的内容"}

但是用户那边就不一样了。

登录正常在线。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{"from":"1111","type":"sendTo","value":"发送给朋友的内容"}

离线接受不到信息

InChat异步消息推送,你可以看到两种

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
在线: {"one":"2222","time":"2018-12-14 11:01:36","type":"sendTo","value":"发送给朋友的内容","token":"1111"}
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
离线: {"one":"2222","time":"2018-12-14 10:59:04","on_online":"2222","type":"sendTo","value":"发送给朋友的内容","token":"1111"}

如果出现用户发送给用户的状态是离线的,则会在消息多出on_online的字段,该字段的内容就是离线用户的Token,你可以针对性的数据入库,并在用户上线的时候,读写信息的时候,有一个未读消息的状态。

发送群聊

你会看到chat.html中的登录按钮对应的js

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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("连接没有开启.");
    }
}

发送成功,本人将接受到消息

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{"groupId":"2","from":"1111","type":"sendGroup","value":"大家明天一起去唱K吧"}

群组中有些人在线接受、离线不接受

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
在线:{"groupId":"2","from":"1111","type":"sendGroup","value":"大家明天一起去唱K吧"}

InChat异步消息入库,群组只会异步给你一个消息,你可以看到on_online中,3333用户是没有接受到信息的,所以你可以在他上线发送未读消息。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{"groupId":"2","time":"2018-12-14 11:09:17","on_online":["3333"],"type":"sendGroup","value":"大家明天一起去唱K吧","token":"1111"}

关于数据库设计

当前一版不会固定大家的数据库设计,大家可以自己自由设计,同时搭上自己的项目,构建一个附带IM的自项目。

前端效果

发送人

接收人


本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
C语言函数大全--s 开头的函数(3)
在使用 sleep() 函数时,将会使当前线程或者进程暂停指定的时间,以便给其他进程或线程执行机会,同时也可以用来控制程序的运行速度。
huazie
2025/07/08
630
C语言函数大全--s 开头的函数(3)
C++标准库中的数学函数
http://blog.sina.com.cn/s/blog_149e9d2ec0102wxqt.html
用户7886150
2021/02/12
1.4K0
C语言_函数【转】
引用地址:http://baike.baidu.com/link?url=U9h6MccLYX2w5uyVOqIFd3eps5gR2FZA10jYRLRnc66Ff_F5ZrmXGKA12DT-_2x
landv
2018/05/24
4.9K0
C++常用的函数
通常,在程序设计中,我们会发现一些程序段在程序的不同地方反复出现,此时可以将这些程序段作为相对独立的整体,用一个标识符给它起一个名字,凡是程序中出现该程序段的地方,只要简单地写上标识符即可。这样的程序段,我们称之为子程序(函数)。下面介绍一下C++提供的各种标准函数。
用户7886150
2021/02/11
1.6K0
站在巨人的肩膀上,C++最常用的200个函数
本文原创首发CSDN,链接 https://blog.csdn.net/qq_41464123/article/details/104529376 ,作者博客https://blog.csdn.net/qq_41464123 ,转载请带上本段内容,尤其是脚本之家、码神岛等平台,谢谢配合。
Designer 小郑
2023/08/01
2590
c++常用库函数整理总结
返回值:如果 c 在 A~Z、a~z 或0~9的范围内,则返回一个非0值;否则返回0。
用户7886150
2021/02/11
1.6K0
【C语言】常用函数汇总表
通过这些表格和示例,你可以掌握C语言中各类常用函数的功能和使用方法。如果你需要进一步深入了解某个函数或需要更多示例,随时告诉我!
LuckiBit
2024/12/11
4820
【C语言】常用函数汇总表
PHP常用函数总结
$x = 5.7; $y = 1.3; // 两个浮点数,x>y 浮点余数 $r = fmod($x, $y); // $r equals 0.5, because 4 * 1.3 + 0.5 = 5.7
V站CEO-西顾
2018/06/12
3.4K1
C语言常用函数表
任何一门语言的重点绝对不是语法或词汇(等效于编程的接口),它的唯一用途是沟通。因此编程语言是为了让计算机服务于我们而存在的。因此我们知其然,但不记其所以然,只要知道它的用途就可以了。
Homqyy
2024/08/23
1930
单片机编程使用C库函数
这个是STM8L单片机代码,注意:如果是IAR编译器需要开启library-FULL
知否知否应是绿肥红瘦
2025/02/19
1550
单片机编程使用C库函数
C/C++常用头文件及函数汇总
C/C++头文件一览 C #include <assert.h>    //设定插入点 #include <ctype.h>     //字符处理 #include <errno.h>     //定义错误码 #include <float.h>     //浮点数处理 #include <iso646.h>        //对应各种运算符的宏 #include <limits.h>    //定义各种数据类型最值的常量 #include <locale.h>    //定义本地化C函数 #include
互联网金融打杂
2018/04/03
3K0
C-Pwn常见函数原型及作用
format:格式字符串,指定了输入的格式,并按照格式说明符解析输入对应位置的信息并存储于可变参数列表中对应的指针所指位置。每一个指针要求非空,并且与字符串中的格式符一一顺次对应。
偏有宸机
2020/11/04
1.6K0
C-Pwn常见函数原型及作用
C语言函数大全--f开头的函数(上)
注意: 如果文件中的一行,不足 n-1 个字符,则读完该行就直接结束。如若该行(包括最后一个换行符)的字符数超过 n-1,则 fgets 只返回一个不完整的行,但是,缓冲区总是以 NULL 字符结尾,对 fgets 的下一次调用会继续读该行。函数成功将返回 stream,失败或读到文件结尾返回 NULL。因此不能直接通过 fgets 的返回值来判断函数是否是出错而终止的,应该借助 feof 函数或者 ferror 函数来判断。
huazie
2025/01/17
2710
C语言函数大全--f开头的函数(上)
C语言函数大全--a开头的函数
开始之前,引用一篇《基于Redis海量数据场景分布式ID架构实践》,该文通过比对不同实现方案的优缺点,帮助大家在分布式ID生成方面提供一些有益的参考和启示。有需要的朋友可以深入研究下!
huazie
2024/12/01
3110
C语言函数大全--a开头的函数
C语言标准库函数大全(ctype、time 、stdio、stdlib、math、string)
上面只是简单的介绍函数原型和功能,如果想对函数进一步了解可以下载以下文档 (内含详解与实例):
全栈程序员站长
2022/09/13
5.8K0
C语言标准库函数大全(ctype、time 、stdio、stdlib、math、string)
C/C++ (stdio.h)标准库详解
cstdio,在C语言中称为stdio.h。该库使用所谓的流与物理设备(如键盘、打印机、终端)或系统支持的任何其他类型的文件一起操作。
DevKevin
2024/03/19
1.2K0
C/C++ (stdio.h)标准库详解
【C++ 程序设计入门基础】- Chapter One
C++ 是一种静态类型的、编译式的、通用的、大小写敏感的、不规则的编程语言,支持过程化编程、面向对象编程和泛型编程。
跟着飞哥学编程
2022/11/16
1.2K0
【C++ 程序设计入门基础】- Chapter One
C/CPP输入输出函数汇总分析
scanf,printf,getc,putc,getchar,putchar,gets,puts,fgets,fputs,fgetc,fputc,fscanf,fprintf等.
CtrlX
2022/11/11
1.4K0
C语言 常用标准库函数 初学者常用
 C语言能用的函数有很多,限于篇幅,加上本人也是初学者,在这里只给出初学者常用的标准库函数。
叶茂林
2023/07/28
5200
C语言函数小集合
一、字符操作 函数名: fputc 功 能: 送一个字符到一个流中 用 法: int fputc(int ch, FILE *stream); 函数名: fputs 功 能: 送一个字符串到一个流中 用 法: int fputs(char *string, FILE *stream); 函数名: sprintf 功 能: 输出数据到一字符串中(而printf是输出到屏幕上) 函数名: fread 用 法: fread(fa,4,5,fp); 功 能: 其意义是从fp所指的文件中,每次读4个字节(一个实数)送入实数组fa中,连续读5次,即读5个实数到fa中 函数名: strncmp 用 法: extern int strncmp(char *s1, char *s2, int n); 功 能: 比较字符串s1和s2的前n个字符。 详 细: 逐次比较两个字符串前n个字符中的每一个字符(用第一个字符串的字符的ASCII值减去第二个字符串的相应字符的ASCII值),如果相等则继续比较下一个;如果不等,ASCII的差值就是返回值。 函数名: isalnum 原型:extern int isalnum(int c); 用法:#include <ctype.h>  功能:判断字符c是否为字母或数字  说明:当c为数字0-9或字母a-z及A-Z时,返回非零值,否则返回零。 函数名: isalpha 原型:extern int isalpha(int c); 用法:#include <ctype.h> 功能:判断字符c是否为英文字母 说明:当c为英文字母a-z或A-Z时,返回非零值,否则返回零。 函数名: iscntrl 原型:extern int iscntrl(int c); 用法:#include <ctype.h> 功能:判断字符c是否为控制字符 说明:当c在0x00-0x1F之间或等于0x7F(DEL)时,返回非零值,否则返回零。 函数名: isdigit 原型:extern int isdigit(int c); 用法:#include <ctype.h> 功能:判断字符c是否为数字 说明:当c为数字0-9时,返回非零值,否则返回零。 函数名: islower 原型:extern int islower(int c); 用法:#include <ctype.h> 功能:判断字符c是否为小写英文字母 说明:当c为小写英文字母(a-z)时,返回非零值,否则返回零。 函数名: isascii 原型:extern int isascii(int c); 用法:#include <ctype.h> 功能:判断字符c是否为ascii码 说明:当c为ascii码时,返回非零值,否则返回零。ascii码指0x00-0x7F之间的字符 函数名: isgraph 原型:extern int isgraph(int c); 用法:#include <ctype.h> 功能:判断字符c是否为除空格外的可打印字符 说明:当c为可打印字符(0x21-0x7e)时,返回非零值,否则返回零。 函数名: isprint 原型:extern int isprint(int c); 用法:#include <ctype.h> 功能:判断字符c是否为可打印字符(含空格) 说明:当c为可打印字符(0x20-0x7e)时,返回非零值,否则返回零。 函数名: ispunct 原型:extern int ispunct(int c); 用法:#include <ctype.h> 功能:判断字符c是否为标点符号 说明:当c为标点符号时,返回非零值,否则返回零。 标点符号指那些既不是字母数字,也不是空格的可打印字符。 函数名: isspace 原型:extern int isspace(int c); 用法:#include <ctype.h> 功能:判断字符c是否为空白符 说明:当c为空白符时,返回非零值,否则返回零。 空白符指空格、水平制表、垂直制表、换页、回车和换行符。 函数名: isupper 原型:extern int isupper(int c);  用法:#include <ctype.h>  功能:判断字符c是否为大写英文字母 说明:当c为大写英文字母(A-Z)时,返回非零值,否则返回零。 函数名: isxdigit 原型:extern int isxdigit(int c); 用法:#include <ctype.h> 功能:判断字符c是否为十六进制数字 说明:当c为A-F,a-f或0-9之间的十六进制数字时,返回非零值,否则返回零。 函数名: toascii 原型:extern int toascii(int c);
阳光岛主
2019/02/19
1.3K0
相关推荐
C语言函数大全--s 开头的函数(3)
更多 >
交个朋友
加入腾讯云官网粉丝站
蹲全网底价单品 享第一手活动信息
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验