$socket 长连接

$socket可以让服务器主动推送数据给客户端,实现多个在线用户之间及时传递消息

前端接口

$socket.open(频道, 事件响应, 选项) 打开长连接

频道:字符串或数组,希望接受到哪些频道的消息。
事件响应:事件响应对象可包含如下表达式
onConn:连接上(connect)服务器后执行的表达式。重连或订阅新频道也会再次执行。
onData:收到消息后执行的表达式。
onHeartbeat:响应心跳表达式。为了保持长连接,客户端和服务器每30秒内就会同步一次心跳。变量connected表示连接状态,date表示心跳时间,date() - date - 30000表示断开连接多久了。
onError:发生错误后执行的表达式。
选项
login0:无需登录(将忽略saveToDB);1:要登录且只能有一个会话(session),多处登录会断开前面的连接;2:要登录并允许多个会话(可多端登录的同一用户能接受到相同的消息)。默认为1。
saveToDB:是否把消息保存到数据库*
autoResend:重连后是否自动重发断连期间未能发送的消息。
online:是否响应用户上线消息,有用户上线时将收到{type: "online", session: id, x: user_id}
offline:是否响应用户下线消息,有用户下线时将收到{type: "offline", session: id, x: user_id}

$socket.send(to, 消息类型, 消息内容) 发送消息

可以发给某人(当to是用户id时)或广播给某个频道里的所有人(当to是频道时)。
它是异步接口,不等待发送结果就执行下一表达式(因此无$r),发送结果转而由onData接收,格式如下:

{ 
    d: Number,         // 发送时间,即date().getTime()
    from: User,        // 发送人ID
    session: id,       // 发送人的会话ID
    to: User/String,   // 接收人ID或频道名
    type: String,      // 消息类型 
    x: Any             // 消息内容
}

zchannel是特殊消息类型,用在已打开连接要订阅新频道时,比如加入新群聊,在新群发消息前先订阅一下$socket.send(群id, "zchannel")才能收到此群的消息。如果不想再收到此群消息则可通过$socket.send(群id, "zchannel", -1)退订。

$socket.online(频道) 在线用户

查询当前指定频道的在线用户。返回 { session: [], user: [], map: {} },map存放的是user及其session数组的映射关系。

* saveToDB开启后会把消息保存到type为"zsocket"的tkdb中;群聊的话它的key为频道ID,私聊的话它的key是聊天双方用下划线拼接的用户ID;x是消息对象数组 [{ type, from, d, x }],其中d是数值格式的消息发送时间,x是消息内容。例:
查找"我的"私聊消息历史:$tkdb.find("私聊消息", { type: "zsocket", key: { $regex: $c.me.id } })
查找某个群聊消息历史:$tkdb.find("群聊消息", { type: "zsocket", key: { $in: 群ID } })
删除某人某次时间发的消息:$tkdb.update(消息ID, { $pull: { x: { from, d } } })
删除整个聊天消息:$tkdb.delete(消息ID)

后端接口

$socket.send(发送者, to, 消息类型, 消息内容, 选项)

由于后端接口可能是系统自动触发的,不能用登录用户id作为默认发送方,因此必须传【发送者】参数,
另外还多了一个选项:{ sendBack: false, cc: [] }:
sendBack:是否要给接口调用者也回发一次消息,前端是一定会回发的,后端默认不回发。
cc:抄送列表,同时也发送给其他人。

由众触低代码平台生成和驱动