“推送消息服务器”的客户端

继续出版“服务器推送消息”

在开发客户部分时,没有重复和使设计像其他目标的目标。
另一方面,在台式机版本中很难更改区域并进行新的排列。 左侧的联系区域,右侧的消息,底部的新消息的输入区域并不是那么容易变得更好和更方便。 在许多现代解决方案中,设计和设计元素与移动程序相同。 我认为这就是为什么不可能扩展消息输入字段以进行两行或更多行的原因。



虚线分隔符在图片中可见,当您将鼠标悬停时,它将变成黄黑色条纹。 通过移动分隔符,可以调整用于输入消息的字段的高度。

同样,您可以更改联系人列表和消息列表的宽度。

发送消息是动画的,在其他程序中发送消息时没有动画。

联系人列表的背景使用灰色和粉红色的渐变色,可以在天空中以发光的形式找到类似的组合。

在线用户的名称为橙色,连通房(组)为黑色。 用户不在线,并且禁用的组为灰色。 您可以通过星名将房间与联系人列表中的用户区分开,房间名称以start开头



用户可以创建新房间(组),添加从组中删除用户。 同样,如果编辑用户在会议室用户列表中具有管理员标志,则可以更改会议室。



可以传输文件,图像文件将立即在消息中发送并显示在消息中。 视频文件不会立即发送,仅发送第一帧,要下载,您必须运行视频。 类似地,仅在单击消息中的文件后,才能下载其他文件。 最大文件大小以及将大文件分为的文件部分的大小在push0k admin中配置。 要发送文件,您可以使用“发送附件”按钮;您也可以简单地将文件拖放到消息窗口中。 同样,可以将邮件中的已发送文件拖到Mac OS上的Explorer或finder文件夹中。 换句话说,对文件实现了拖放。



邮件被删除的html标签。 但是,降价类似于降价。

* 粗体 *
斜体
_ 下划线 _

您可以发送链接,但是链接应该是单独的消息。

每条消息都有按钮:

“”引用消息
➦消息转发



为了安全地连接到服务器,将使用带锁的按钮。 逻辑类似于浏览器-证书过期,自签名或来自其他域名的不安全证书,锁已打开-连接不安全。 带锁的按钮将打开证书信息。



所有服务器用户都是彼此可见的,即每个用户的联系人都是其他用户。 用户可以重命名他们的联系人。 可以阻止来自联系人的新消息的通知,也可以完全阻止来自联系人的消息。



消息不能实现发送微笑。 没有视频或音频连接。 无法演示用户的屏幕。 将来,我一定会实现上述一些功能。

下载push0k客户端:

窗户
Mac OS

该应用程序是使用vue.js在电子上完成的。 该应用程序是免费的,但是与本文第一部分中描述的服务器不同,我不打算打开源代码。

连接例


连接包括三个部分:

  1. 建立连接。

    对于安全连接,这是握手消息传递。
  2. 授权书

    授权期间,除了登录外,还会从密码哈希+连接ID传输哈希。

    在授权消息中,将传输计算机参数:操作系统类型,操作系统版本,处理器,内存,计算机名称。 此参考数据对于统计和理解OS,处理器和内存的类型如何影响连接,数据交换等速度非常必要。

    该程序的第一个版本是从1s开始制作和工作的。 通常,在一台计算机上不能启动一个1c数据库,但可以启动多个数据库,例如,一个会计的内存管理器和BP。 如果该解决方案用于支持会计,那么了解会计信息是从哪个数据库发送的,这一点很重要。 授权期间,还将传输数据库数据。
  3. 数据同步。

    收到有关授权成功的消息后,带有日期的数据请求消息将发送到服务器。 用户或房间(组)的最后一条消息或最后一次更改的最大日期。 通过发送日期,确定新消息或更改的用户,房间(组)。 日期可以为空,然后所有消息都会被用户和房间接收,这可能是您首次连接。

    接收到同步数据后,将确认数据接收和计算的“连接建立”,“授权”,“数据同步”时间的消息发送到服务器。

将socket.io连接到html页面。


对于node.js

  • 打开控制台
  • 转到项目文件夹,命令`cd / yourCatalog`
  • 运行安装命令`npm install socket.io`

Node.js示例代码:

const io = require('socket.io-client'); const crypto = require('crypto'); const os = require('os'); const cpusarray = os.cpus(); let actiontime = 0; let contime = 0; let auftime = 0; let datasintime = 0; let socket; let lastdatesync = new Date(0).toISOString(); let usernumber = '+7 (999) 777-77-77'; let pw = 'somePassword'; let baseref = process.cwd(); let basename = 'push0k client'; let baseid = crypto .createHash('md5') .update(appdirectory) .digest('hex'); baseid = baseid.substring(0, 8) + '-' + baseid.substring(8, 12) + '-' + baseid.substring(12, 16) + '-' + baseid.substring(16, 20) + '-' + baseid.substring(20, 32); let basever = '19.02'; let clientid = crypto .createHash('md5') .update(os.hostname()) .digest('hex'); clientid = clientid.substring(0, 8) + '-' + clientid.substring(8, 12) + '-' + clientid.substring(12, 16) + '-' + clientid.substring(16, 20) + '-' + clientid.substring(20, 32); let syncdata = ''; let syncdatasize = 0; function sha256(p) { const hash = crypto.createHash('sha256'); hash.update(p); return '' + hash.digest('hex'); } function connect() { socket = io('http://yourServer.com:6789', { transports: ['websocket'], timeout: 5000 }); socket.connect(); socket.on('connect', onconnect); socket.on('message', onmessage); actiontime = new Date().getTime(); } function onconnect() { contime = new Date().getTime() - actiontime; usernumber = usernumber.replace(/\D/g, ''); socket .binary(false) .emit( 'message', '{"event":"auf","user":"' + usernumber + '","password":"' + sha256(pw + socket.id) + '","roomsjoin":true,"basename":"' + basename + '","basever":"' + basever + '","baseid":"' + baseid + '","baseref":"' + encodeURIComponent(baseref) + '","osversion":"' + encodeURIComponent(os.release()) + '","appversion":"18.08","clientid":"' + clientid + '","infappview":"","ram":"' + os.totalmem() / 1024 / 1024 + '","proc":"' + encodeURIComponent(cpusarray[0].model) + '","ostype":"' + encodeURIComponent(os.type() + ' ' + os.arch()) + '","compname":"' + encodeURIComponent(os.hostname()) + '"}' ); //      let filetranfer = msgdata.filetranfer; let filemaxsize = msgdata.filemaxsize; let filepartsize = msgdata.filepartsize; actiontime = new Date().getTime(); } function onmessage(msg) { let msgdata; let mestime = new Date().getTime(); if (typeof msg === 'string') { try { msgdata = JSON.parse(msg); } catch (err) { this.message = err.toString(); return; } } else if (typeof msg === 'object') { msgdata = msg; } if (msgdata.event === 'connected') { auftime = mestime - actiontime; socket .binary(false) .emit( 'message', '{"event":"getData","userid":"' + msgdata.userid + '","id":"' + msgdata.id + '","baseid":"' + baseid + '","clientid":"' + clientid + '","lastdatesinc":"' + lastdatesync + '"}' ); if (msgdata.setpass === 'true') { //       //       // openDialogSetNewPassword(); } actiontime = new Date().getTime(); } else if (msgdata.event === 'datasync') { syncdata += msgdata.data; syncdatasize += Buffer.byteLength(msg, 'utf8'); if (msgdata.dataPart < msgdata.partsCount) { return; } datasintime = mestime - actiontime; socket .binary(false) .emit( 'message', '{"event":"dataConfirm","userid":"' + msgdata.userid + '","dataid":"' + msgdata.dataid + '","baseid":"' + baseid + '","contime":' + contime + ',"auftime":' + auftime + ',"datasintime":' + datasintime + ',"datesync":"' + msgdata.datesync + '","datasize":' + syncdatasize + '}' ); contime = 0; datasintime = 0; auftime = 0; syncdatasize = 0; let datasync = JSON.parse(Buffer.from(syncdata, 'base64').toString('utf8')); syncdata = ''; //      // datasync.Users   // datasync.Rooms   // datasync.Cons    // datasync.joinedRooms    // datasync.Mess   } } 

Source: https://habr.com/ru/post/zh-CN439414/


All Articles