bzGhost我用业余时间写了个微信

212 阅读5分钟

bzGhost简介

 

 

打造跨终端跨平台即时通讯,个人也能玩的转的聊天软件。

版权信息

软件遵循MIT开源协议,意味着您无需支付任何费用,也无需授权,即可将 软件应用到您的产品中。 注意:这并不意味着您可以将软件应用到非法的领域,比如涉及赌博、色情、暴力、宗教等方面。 如因此产生纠纷等法律问题, 作者不承担任何责任。切勿以身试法!!! 网络不是法外之地

参考文献

联系方式

  • 如有问题联系作者 18767176707
  • 讨论加群:qq群 11025293030 下

载体验

会将各个版本的演示在此展示,目前演示的版本有安卓,电脑,后台管理,其他版本演示将会陆续添加

演示地址

链接语言版本开源
后台管理Vue1.0.0100%
安卓端Uniapp1.0.0100%
电脑端Electron1.0.0100%
H5端Uniapp1.0.0100%
Web端Electron1.0.0100%
通信Netty1.0.0100%
接口Java1.0.0有偿

1.5 账号说明

**注意: 管理员账号:admin /123456

测试账号:test/123456 技

术选型

技术说明官网
ElectronElectron基于Chromium和Node.js,让你可以使用HTML,CSS和JavaScript构建应用。兼容Mac、Windows和Linux,可以构建出三个平台应用程序。www.electronjs.org/
uni-app是一个使用Vue.js开发所有端应用的框架,开发者编写一套代码,可发布到iOS、Android、Web(响应式)、以及各种小程序(微信/支付宝/百度/头条/飞书/QQ/快手/钉钉/淘宝)、快应用等多个平台。uniapp.dcloud.io/
NettyNetty是一个异步事件驱动的网络应用程序框架用于快速开发可维护的高性能协议服务器和客户端netty.io/
Spring Boot核心框架spring.io/projects/sp…
MyBatis持久层mybatis.org/mybatis-3/z…
Redis缓存redis.io/
Maven项目构建maven.apache.org/
Mysql数据库www.mysql.com/

webPacketCode

数据包解码文件

报文格式:magic4字节 + 版本1字节 + 序列化算法1字节 + 指令1字节 + 数据长度4字节 + 数据内容

总字节长度 = 11 + 数据内容长度

  • 编码encode
let dataView = new DataView(buffer)


    dataView.setInt32(0, 0x12345678)


    dataView.setInt8(4, packet.version)


    dataView.setInt8(5, 1) // 写死1表示json序列化


    dataView.setInt8(6, packet.command)


    dataView.setInt32(7, bytes.length)


for (let i = 11; i < bytes.length + 11; i++) {
    dataView.setUint8(i, bytes[i - 11])
}
  • 解码decode
let dataView = new DataView(buffer)


let lenght = dataView.getInt32(7)


let bytes = []
for (let i = 11; i < lenght + 11; i++) {
    bytes[i - 11] = dataView.getUint8(i)
}

webIm

通讯文件

  • 分离了API 与webSocket 。
  • 群通道,用户通道。
  • 重试次数,心跳检测,断网重连。
  • 字节传输,支持自定义加密解密等功能。

1.1 用户绑定

  • 方法名 login
  • 参数说明
属性名备注类型可选值
userId用户唯一标识String5f6d9d98
command指令集Number1
version版本号Number1
  • 示例代码
import webim from '@/util/socket/webim.js';
// 全局初始化
webim.initSocket();

webim.login(userId, command, version, res=>{
    //输出res
});
  • 请求入参
let packet = {
version:1,
command: 1,
userId:"5f6d9d98"
}
  • 响应参数
let packet = {
version : 1,
command: 2,
errorMsg:"",
success: true
}

1.2 加入群组

  • 方法名 joinGroup
  • 参数说明
属性名备注类型可选值
chatId聊天对象(群/用户)String04b09fbee3d24a21a2acedc755d5d7c3
userId唯一标识String5f6d9d98
chatType聊天类型(群聊/私聊)Number0/1
command指令集Number7
version版本号Number1
  • 请求入参
let packet = {
    chatId:"04b09fbee3d24a21a2acedc755d5d7c3",
    userId:"5f6d9d98",
    chatType: 0,
    version: 1,
    command: 7
}
  • 响应参数
let packet = {
    version : 1,
    command: 8,
    errorMsg:"",
    success: true
}

1.3 退出群组

  • 方法名 quitGroup
  • 参数说明 ( 参照加入群组 )
  • 请求入参
let packet = {
    chatId:"04b09fbee3d24a21a2acedc755d5d7c3",
    userId:"5f6d9d98",
    chatType: 0,
    version: 1,
    command: 9
}
  • 响应参数
let packet = {
    version : 1,
    command: 10,
    errorMsg:"",
    success: true
}

1.4 发送消息

  • 方法名 sendMessage
  • 参数说明
属性名备注类型可选值
isItMe发送人Boolenfalse/true
contentType消息类型(文字/图片/语音/视频/红包)Number0/1/2/3/4/5
content消息内容String测试
createTime创建时间Date2021-11-2
hasBeenSentId消息idString1447565
fromUserId发送人idString220e805b8521444e9f27d78e45633b44
fromUserName发送人账户Stringtest
fromUserHeadImg发送人图像Stringdefalut.jpg
userId当前用户idString5f6d9d98
toUserId接收人idString5f6d9d98
toUserName接收人账户Stringadmin
toUserHeadImg接收人图像Stringdefalut.jpg
chatType聊天类型(群/私)Number1/0
version版本Number1
command指令集Number3
  • 请求入参
let packet = {
    isItMe: true,
    contentType: 0,
    content: "测试",
    createTime: Date.now(),
    hasBeenSentId: Date.now(),
    fromUserId: "5f6d9d98",
    fromUserName: "admin",
    fromUserHeadImg: '/static/image/huge.jpg',
    userId: "5f6d9d98",
    toUserId: "220e805b8521444e9f27d78e45633b44",
    toUserName: "test",
    toUserHeadImg:'/static/image/huge.jpg',
    chatType: 0,
    version : 1,
    command: 3,
};
  • 响应参数
let packet = {
    isItMe: true,
    contentType: 0,
    content: "测试",
    createTime: Date.now(),
    hasBeenSentId: Date.now(),
    fromUserId: "5f6d9d98",
    fromUserName: "admin",
    fromUserHeadImg: '/static/image/huge.jpg',
    userId: "5f6d9d98",
    toUserId: "220e805b8521444e9f27d78e45633b44",
    toUserName: "test",
    toUserHeadImg:'/static/image/huge.jpg',
    chatType: 0,
    version : 1,
    command: 4,
};

1.5 指令集参照表

指令集备注
1用户绑定请求
2用户绑定响应
7加群请求
8加群响应
9退群请求
10退群响应
3发送消息请求
4发送消息响应
-10推送响应
-9推送请求

webSocket

封装uni方法 支持心跳包,断线重连,断线重试,网络检测,发送自定义报文。

1.1 initWebSocket(options)

初始化创建一个websocket连接

options参数说明

参数名类型说明
urlString服务器地址ws://协议
successFunction接口调用成功回调函数
failFunction接口调用失败回调函数

示例代码

WEBIM.options = {
    url: 'ws://127.0.0.1',
    success(res) {
        resolve(res);
    },
    fail(e) {
        reject(e);
    }
}

WEBIM.server.initWebSocket(WEBIM.options);

1.2 sendWebSocketMsg(options)

通过 WebSocket 连接发送数据,需要先 initWebSocket,并在 _onSocketOpened回调之后才能发送

options参数说明

属性类型说明
dataArrayBuffer服务器发送消息 encode编码
successFunction成功回调函数
failFunction失败回调函数

示例代码

WEBIM.server.sendWebSocketMsg({
    data: arrayBuffer,
    success(res) {},
    fail(err) {
        // 进行重连
        WEBIM.server._isLogin = false;
        if (WEBIM.server._isReconnection) {
            console.log('网络中断,尝试重连')
            WEBIM.options = {
            url: WEBIM.serverUrl,
            success(res) {},
                fail(err) {}
            }
            WEBIM.server._reConnect(WEBIM.options)
         }
        console.log('【websocket】发送失败,尝试手动重连')
    }
});

1.3 onReceivedMsg(callBack)

监听WebSocket接受到服务器的消息事件。

CALLBACK 返回参数

属性类型说明
callBackArrayBuffer服务器返回消息数据 decode解码

示例代码

WEBIM.server.onReceivedMsg(event => {
    let packet = packetCode.decode(event.data);
    let command = packet.command;
    // 转发事件
    eventDispatcher.dispatchEvent(command, toJSON(packet))
    eventDispatcher.removeListener(command, toJSON(packet))

    if(command === -10){
        store.commit('setNewsPush', packet);
    }
});