-
一个计时器线程
ThreadPool.Instance.StartTimerThread()
, 负责超时检测/安全检查- 默认实现
System.Threading.Timer
, 构造RTMClient
时可以选择是否启用该线程 - 如果已有计时器,
ThreadPool.Instance.OnSecond(object state)
周期性调用该方法,以进行超时检查(建议频率1s)
- 默认实现
-
一个线程池, 接口
ThreadPool.IThreadPool
- 默认实现
System.Threading.ThreadPool.QueueUserWorkItem
- 如需自己管理线程,实现该接口并注册线程池
ThreadPool.Instance.SetPool(IThreadPool value)
- 默认实现
-
不要阻塞事件触发和回调, 否则线程池将被耗尽
using System;
using System.Collections;
using System.Collections.Generic;
using GameDevWare.Serialization;
using com.rtm;
using UnityEngine;
...
// 创建Client
RTMClient client = new RTMClient(
"52.83.245.22:13325",
1000012,
654321,
"3993142515BD88A7156629A3AE550B9B",
null,
new Dictionary<string, string>(),
true,
20 * 1000,
true
);
// 添加监听
client.GetEvent().AddListener("login", (evd) => {
if (evd.GetException() != null) {
Debug.Log("Auth Fail!");
return;
}
Debug.Log("Authed!");
// 发送消息
client.SendMessage(778899, (byte) 8, "hello !", "", 0, 5 * 1000, (cbd) => {
object obj = cbd.GetPayload();
if (obj != null) {
Debug.Log("[DATA] SendMessage: " + Json.SerializeToString(obj) + ", mid: " + cbd.GetMid());
} else {
Debug.Log("[ERR] SendMessage: " + cbd.GetException().Message);
}
});
});
client.GetEvent().AddListener("close", (evd) => {
Debug.Log("Closed! retry: " + evd.HasRetry());
});
client.GetEvent().AddListener("error", (evd) => {
Debug.Log("Error: " + evd.GetException().Message);
});
// push service
RTMProcessor processor = client.GetProcessor();
processor.GetEvent().AddListener(RTMConfig.SERVER_PUSH.recvPing, (evd) => {
Debug.Log("[PUSH] ping: " + Json.SerializeToString(evd.GetPayload()));
});
// 开启连接
client.Login(null, false);
// destory
// client.Destory();
// client = null;
参考Assets/Scripts/Main.cs
:
//TestCase
this.BaseTest(fileBytes);
event
:login
: 登陆exception
: (Exception) auth失败, token失效需重新获取payload
: (IDictionary) 当前连接的RTMGate地址, 可在本地缓存, 下次登陆可使用该地址以加速登陆过程, 每次登陆成功需更新本地缓存
error
: 发生异常exception
: (Exception)
close
: 连接关闭retry
: (bool) 是否自动重连
请参考 RTMConfig.SERVER_PUSH
成员
-
kickout
: RTMGate主动断开data
: (IDictionary)
-
kickoutroom
: RTMGate主动从Room移除data.rid
: (long) Room id
-
ping
: RTMGate主动pingdata
: (IDictionary)
-
pushmsg
: RTMGate主动推送P2P消息data.from
: (long) 发送者 iddata.mtype
: (byte) 消息类型data.mid
: (long) 消息 id, 当前链接会话内唯一data.msg
: (string) 消息内容data.attrs
: (string) 发送时附加的自定义内容data.mtime
: (long)
-
pushgroupmsg
: RTMGate主动推送Group消息data.from
: (long) 发送者 iddata.gid
: (long) Group iddata.mtype
: (byte) 消息类型data.mid
: (long) 消息 id, 当前链接会话内唯一data.msg
: (string) 消息内容data.attrs
: (string) 发送时附加的自定义内容data.mtime
: (long)
-
pushroommsg
: RTMGate主动推送Room消息data.from
: (long) 发送者 iddata.rid
: (long) Room iddata.mtype
: (byte) 消息类型data.mid
: (long) 消息 id, 当前链接会话内唯一data.msg
: (string) 消息内容data.attrs
: (string) 发送时附加的自定义内容data.mtime
: (long)
-
pushbroadcastmsg
: RTMGate主动推送广播消息data.from
: (long) 发送者 iddata.mtype
: (byte) 消息类型data.mid
: (long) 消息 id, 当前链接会话内唯一data.msg
: (string) 消息内容data.attrs
: (string) 发送时附加的自定义内容data.mtime
: (long)
-
pushfile
: RTMGate主动推送P2P文件data.from
: (long) 发送者 iddata.mtype
: (byte) 文件类型, 请参考RTMConfig.FILE_TYPE
成员data.mid
: (long) 消息 id, 当前链接会话内唯一data.msg
: (string) 文件获取地址(url)data.attrs
: (string) 发送时附加的自定义内容data.mtime
: (long)
-
pushgroupfile
: RTMGate主动推送Group文件data.from
: (long) 发送者 iddata.gid
: (long) Group iddata.mtype
: (byte) 文件类型, 请参考RTMConfig.FILE_TYPE
成员data.mid
: (long) 消息 id, 当前链接会话内唯一data.msg
: (string) 文件获取地址(url)data.attrs
: (string) 发送时附加的自定义内容data.mtime
: (long)
-
pushroomfile
: RTMGate主动推送Room文件data.from
: (long) 发送者 iddata.rid
: (long) Room iddata.mtype
: (byte) 文件类型, 请参考RTMConfig.FILE_TYPE
成员data.mid
: (long) 消息 id, 当前链接会话内唯一data.msg
: (string) 文件获取地址(url)data.attrs
: (string) 发送时附加的自定义内容data.mtime
: (long)
-
pushbroadcastfile
: RTMGate主动推送广播文件data.from
: (long) 发送者 iddata.mtype
: (byte) 文件类型, 请参考RTMConfig.FILE_TYPE
成员data.mid
: (long) 消息 id, 当前链接会话内唯一data.msg
: (string) 文件获取地址(url)data.attrs
: (string) 发送时附加的自定义内容data.mtime
: (long)
-
Constructor(string dispatch, int pid, long uid, string token, string version, IDictionary<string, string> attrs, bool reconnect, int timeout, bool startTimerThread)
: 构造RTMClientdispatch
: (string) Dispatch服务地址, RTM提供pid
: (int) 应用编号, RTM提供uid
: (long) 用户IDtoken
: (string) 用户登录Token, RTM提供version
: (string) 服务器版本号, RTM提供attrs
: (IDictionary(string,string)) 设置用户端信息, 保存在当前链接中, 客户端可以获取到reconnect
: (bool) 是否自动重连timeout
: (int) 超时时间(ms), 默认:30 * 1000
startTimerThread
: (bool) 是否开启计时器线程 (负责超时检测/安全检查)
-
GetProcessor
: (RTMProcessor) 监听PushService的句柄 -
Destroy()
: 断开连接并销毁 -
Login(string endpoint, bool ipv6)
: 连接并登陆endpoint
: (string) RTMGate服务地址, 由Dispatch服务获取, 或由RTM提供ipv6
: (bool) 是否为IPV6地址格式
-
SendMessage(long to, byte mtype, string msg, string attrs, long mid, int timeout, CallbackData callback)
: 发送消息to
: (long) 接收方uidmtype
: (byte) 消息类型msg
: (string) 消息内容attrs
: (string) 消息附加信息, 没有可传""
mid
: (long) 消息 id, 用于过滤重复消息, 非重发时为0
timeout
: (int) 超时时间(ms)callback
: (CallbackData) 回调方法cbd
: (CallbackData)payload
: (IDictionary(mtime:long))exception
: (Exception)mid
: (long)
-
SendGroupMessage(long gid, byte mtype, string msg, string attrs, long mid, int timeout, CallbackData callback)
: 发送group消息gid
: (long) group idmtype
: (byte) 消息类型msg
: (string) 消息内容attrs
: (string) 消息附加信息, 可传""
mid
: (long) 消息 id, 用于过滤重复消息, 非重发时为0
timeout
: (int) 超时时间(ms)callback
: (CallbackData) 回调方法cbd
: (CallbackData)payload
: (IDictionary(mtime:long))exception
: (Exception)mid
: (long)
-
SendRoomMessage(long rid, byte mtype, string msg, string attrs, long mid, int timeout, CallbackData callback)
: 发送room消息rid
: (long) room idmtype
: (byte) 消息类型msg
: (string) 消息内容attrs
: (string) 消息附加信息, 可传""
mid
: (long) 消息 id, 用于过滤重复消息, 非重发时为0
timeout
: (int) 超时时间(ms)callback
: (CallbackData) 回调方法cbd
: (CallbackData)payload
: (IDictionary(mtime:long))exception
: (Exception)mid
: (long)
-
GetUnreadMessage(int timeout, CallbackData callback)
: 检测未读消息数目timeout
: (int) 超时时间(ms)callback
: (CallbackData) 回调方法cbd
: (CallbackData)mid
: (long)exception
: (Exception)payload
: (IDictionary(p2p:IDictionary(string,int),group:IDictionary(string,int)))
-
CleanUnreadMessage(int timeout, CallbackData callback)
: 清除未读消息timeout
: (int) 超时时间(ms)callback
: (CallbackData) 回调方法cbd
: (CallbackData)payload
: (IDictionary)exception
: (Exception)mid
: (long)
-
GetSession(int timeout, CallbackData callback)
: 获取所有会话timeout
: (int) 超时时间(ms)callback
: (CallbackData) 回调方法cbd
: (CallbackData)mid
: (long)exception
: (Exception)payload
: (IDictionary(p2p:IDictionary(string,long),group:IDictionary(string,long)))
-
GetGroupMessage(long gid, bool desc, int num, long begin, long end, long lastid, int timeout, CallbackData callback)
: 获取Group历史消息gid
: (long) Group iddesc
: (bool)true
: 则从end
的时间戳开始倒序翻页,false
: 则从begin
的时间戳顺序翻页num
: (int) 获取数量, 一次最多获取20条, 建议10条begin
: (long) 开始时间戳, 毫秒, 默认0
, 条件:>=
end
: (long) 结束时间戳, 毫秒, 默认0
, 条件:<=
lastid
: (long) 最后一条消息的id, 第一次默认传0
, 条件:> or <
timeout
: (int) 超时时间(ms)callback
: (CallbackData) 回调方法cbd
: (CallbackData)exception
: (Exception)payload
: (IDictionary(num:int,lastid:long,begin:long,end:long,msgs:List(GroupMsg)))GroupMsg.id
(long)GroupMsg.from
(long)GroupMsg.mtype
(byte)GroupMsg.mid
(long)GroupMsg.deleted
(bool)GroupMsg.msg
(string)GroupMsg.attrs
(string)GroupMsg.mtime
(long)
-
GetRoomMessage(long rid, bool desc, int num, long begin, long end, long lastid, int timeout, CallbackData callback)
: 获取Room历史消息rid
: (long) Room iddesc
: (bool)true
: 则从end
的时间戳开始倒序翻页,false
: 则从begin
的时间戳顺序翻页num
: (int) 获取数量, 一次最多获取20条, 建议10条begin
: (long) 开始时间戳, 毫秒, 默认0
, 条件:>=
end
: (long) 结束时间戳, 毫秒, 默认0
, 条件:<=
lastid
: (long) 最后一条消息的id, 第一次默认传0
, 条件:> or <
timeout
: (int) 超时时间(ms)callback
: (CallbackData) 回调方法cbd
: (CallbackData)exception
: (Exception)payload
: (IDictionary(num:int,lastid:long,begin:long,end:long,msgs:List(RoomMsg)))RoomMsg.id
(long)RoomMsg.from
(long)RoomMsg.mtype
(byte)RoomMsg.mid
(long)RoomMsg.deleted
(bool)RoomMsg.msg
(string)RoomMsg.attrs
(string)RoomMsg.mtime
(long)
-
GetBroadcastMessage(bool desc, int num, long begin, long end, long lastid, int timeout, CallbackData callback)
: 获取广播历史消息desc
: (bool)true
: 则从end
的时间戳开始倒序翻页,false
: 则从begin
的时间戳顺序翻页num
: (int) 获取数量, 一次最多获取20条, 建议10条begin
: (long) 开始时间戳, 毫秒, 默认0
, 条件:>=
end
: (long) 结束时间戳, 毫秒, 默认0
, 条件:<=
lastid
: (long) 最后一条消息的id, 第一次默认传0
, 条件:> or <
timeout
: (int) 超时时间(ms)callback
: (CallbackData) 回调方法cbd
: (CallbackData)exception
: (Exception)payload
: (IDictionary(num:int,lastid:long,begin:long,end:long,msgs:List(BroadcastMsg)))BroadcastMsg.id
(long)BroadcastMsg.from
(long)BroadcastMsg.mtype
(byte)BroadcastMsg.mid
(long)BroadcastMsg.deleted
(bool)BroadcastMsg.msg
(string)BroadcastMsg.attrs
(string)BroadcastMsg.mtime
(long)
-
GetP2PMessage(long ouid, bool desc, int num, long begin, long end, long lastid, int timeout, CallbackData callback)
: 获取P2P历史消息ouid
: (long) 获取和两个用户之间的历史消息desc
: (bool)true
: 则从end
的时间戳开始倒序翻页,false
: 则从begin
的时间戳顺序翻页num
: (int) 获取数量, 一次最多获取20条, 建议10条begin
: (long) 开始时间戳, 毫秒, 默认0
, 条件:>=
end
: (long) 结束时间戳, 毫秒, 默认0
, 条件:<=
lastid
: (long) 最后一条消息的id, 第一次默认传0
, 条件:> or <
timeout
: (int) 超时时间(ms)callback
: (CallbackData) 回调方法cbd
: (CallbackData)exception
: (Exception)payload
: (IDictionary(num:int,lastid:long,begin:long,end:long,msgs:List(P2PMsg)))P2PMsg.id
(long)P2PMsg.direction
(byte)P2PMsg.mtype
(byte)P2PMsg.mid
(long)P2PMsg.deleted
(bool)P2PMsg.msg
(string)P2PMsg.attrs
(string)P2PMsg.mtime
(long)
-
FileToken(string cmd, List<long> tos, long to, long rid, long gid, int timeout, CallbackData callback)
: 获取发送文件的tokencmd
: (string) 文件发送方式sendfile | sendfiles | sendroomfile | sendgroupfile | broadcastfile
tos
: (List(long)) 接收方 uidsto
: (long) 接收方 uidrid
: (long) Room idgid
: (long) Group idtimeout
: (int) 超时时间(ms)callback
: (CallbackData) 回调方法cbd
: (CallbackData)exception
: (Exception)payload
: (IDictionary(token:string, endpoint:string))
-
Close()
: 断开连接 -
AddAttrs(IDictionary<string, string> attrs, int timeout, CallbackData callback)
: 设置客户端信息, 保存在当前链接中, 客户端可以获取到attrs
: (IDictionary(string,string)) key-value形式的变量timeout
: (int) 超时时间(ms)callback
: (CallbackData) 回调方法cbd
: (CallbackData)payload
: (IDictionary)exception
: (Exception)
-
GetAttrs(int timeout, CallbackData callback)
: 获取客户端信息timeout
: (int) 超时时间(ms)callback
: (CallbackData) 回调方法cbd
: (CallbackData)exception
: (Exception)payload
: (IDictionary(attrs:List(IDictionary)))IDictionary.ce
(string)IDictionary.login
(string)IDictionary.my
(string)
-
AddDebugLog(string msg, string attrs, int timeout, CallbackData callback)
: 添加debug日志msg
: (string) 调试信息msgattrs
: (string) 调试信息attrstimeout
: (int) 超时时间(ms)callback
: (CallbackData) 回调方法cbd
: (CallbackData)payload
: (IDictionary)exception
: (Exception)
-
AddDevice(string apptype, string devicetoken, int timeout, CallbackData callback)
: 添加设备, 应用信息apptype
: (string) 应用信息devicetoken
: (string) 设备信息timeout
: (int) 超时时间(ms)callback
: (CallbackData) 回调方法cbd
: (CallbackData)payload
: (IDictionary)exception
: (Exception)
-
RemoveDevice(string devicetoken, int timeout, CallbackData callback)
: 删除设备, 应用信息devicetoken
: (string) 设备信息timeout
: (int) 超时时间(ms)callback
: (CallbackData) 回调方法cbd
: (CallbackData)payload
: (IDictionary)exception
: (Exception)
-
SetTranslationLanguage(string targetLanguage, int timeout, CallbackData callback)
: 设置自动翻译的默认目标语言类型, 如果 targetLanguage 为空字符串, 则取消自动翻译targetLanguage
: (string) 翻译的目标语言类型timeout
: (int) 超时时间(ms)callback
: (CallbackData) 回调方法cbd
: (CallbackData)payload
: (IDictionary)exception
: (Exception)
-
Translate(string originalMessage, string originalLanguage, string targetLanguage, int timeout, CallbackData callback)
: 翻译消息originalMessage
: (string) 待翻译的原始消息originalLanguage
: (string) 待翻译的消息的语言类型, 可为null
targetLanguage
: (string) 本次翻译的目标语言类型timeout
: (int) 超时时间(ms)callback
: (CallbackData) 回调方法cbd
: (CallbackData)exception
: (Exception)payload
: (IDictionary(stext:string,src:string,dtext:string,dst:string))
-
AddFriends(List<long> friends, int timeout, CallbackData callback)
: 添加好友, 每次最多添加100人friends
: (List(long)) 多个好友 idtimeout
: (int) 超时时间(ms)callback
: (CallbackData) 回调方法cbd
: (CallbackData)payload
: (IDictionary)exception
: (Exception)
-
DeleteFriends(List<long> friends, int timeout, CallbackData callback)
: 删除好友, 每次最多删除100人friends
: (List(long)) 多个好友 idtimeout
: (int) 超时时间(ms)callback
: (CallbackData) 回调方法cbd
: (CallbackData)payload
: (IDictionary)exception
: (Exception)
-
GetFriends(int timeout, CallbackData callback)
: 获取好友timeout
: (int) 超时时间(ms)callback
: (CallbackData) 回调方法cbd
: (CallbackData)payload
: (List(long))exception
: (Exception)
-
AddGroupMembers(long gid, List<long> uids, int timeout, CallbackData callback)
: 添加group成员, 每次最多添加100人gid
: (long) group iduids
: (List(long)) 多个用户 idtimeout
: (int) 超时时间(ms)callback
: (CallbackData) 回调方法cbd
: (CallbackData)payload
: (List(long))exception
: (Exception)
-
DeleteGroupMembers(long gid, List<long> uids, int timeout, CallbackData callback)
: 删除group成员, 每次最多删除100人gid
: (long) group iduids
: (List(long)) 多个用户 idtimeout
: (int) 超时时间(ms)callback
: (CallbackData) 回调方法cbd
: (CallbackData)payload
: (List(long))exception
: (Exception)
-
GetGroupMembers(long gid, int timeout, CallbackData callback)
: 获取group成员gid
: (long) group idtimeout
: (int) 超时时间(ms)callback
: (CallbackData) 回调方法cbd
: (CallbackData)payload
: (List(long))exception
: (Exception)
-
GetUserGroups(int timeout, CallbackData callback)
: 获取用户所在的Grouptimeout
: (int) 超时时间(ms)callback
: (CallbackData) 回调方法cbd
: (CallbackData)payload
: (List(long))exception
: (Exception)
-
EnterRoom(long rid, int timeout, CallbackData callback)
: 进入房间rid
: (long) 房间 idtimeout
: (int) 超时时间(ms)callback
: (CallbackData) 回调方法cbd
: (CallbackData)payload
: (IDictionary)exception
: (Exception)
-
LeaveRoom(long rid, int timeout, CallbackData callback)
: 离开房间rid
: (long) 房间 idtimeout
: (int) 超时时间(ms)callback
: (CallbackData) 回调方法cbd
: (CallbackData)payload
: (IDictionary)exception
: (Exception)
-
GetUserRooms(int timeout, CallbackData callback)
: 获取用户所在的Roomtimeout
: (int) 超时时间(ms)callback
: (CallbackData) 回调方法cbd
: (CallbackData)payload
: (List(long))exception
: (Exception)
-
GetOnlineUsers(List<long> uids, int timeout, CallbackData callback)
: 获取在线用户, 限制每次最多获取200个uids
: (List(long)) 多个用户 idtimeout
: (int) 超时时间(ms)callback
: (CallbackData) 回调方法cbd
: (CallbackData)payload
: (List(long))exception
: (Exception)
-
DeleteMessage(long mid, long xid, byte type, int timeout, CallbackData callback)
: 删除消息mid
: (long) 消息 idxid
: (long) 消息接收方 id (userId/RoomId/GroupId)type
: (byte) 接收方类型 (1:p2p, 2:group, 3:room)timeout
: (int) 超时时间(ms)callback
: (CallbackData) 回调方法cbd
: (CallbackData)payload
: (IDictionary)exception
: (Exception)
-
Kickout(string ce, int timeout, CallbackData callback)
: 踢掉一个链接 (只对多用户登录有效, 不能踢掉自己, 可以用来实现同类设备唯一登录)ce
: (string) 当前链接的endpoint
, 可以通过调用getAttrs
获取timeout
: (int) 超时时间(ms)callback
: (CallbackData) 回调方法cbd
: (CallbackData)payload
: (IDictionary)exception
: (Exception)
-
DBGet(string key, int timeout, CallbackData callback)
: 获取存储的数据信息, 返回值不包含val
表示key
不存在key
: (string) 存储数据对应键值, 最长128 字节
timeout
: (int) 超时时间(ms)callback
: (CallbackData) 回调方法cbd
: (CallbackData)exception
: (Exception)payload
: (IDictionary(val:string))
-
DBSet(string key, string value, int timeout, CallbackData callback)
: 设置存储的数据信息,value
为空则删除对应key
key
: (string) 存储数据对应键值, 最长128 字节
value
: (string) 存储数据实际内容, 最长1024 * 1024 * 2 字节
timeout
: (int) 超时时间(ms)callback
: (CallbackData) 回调方法cbd
: (CallbackData)payload
: (IDictionary)exception
: (Exception)
-
SendFile(byte mtype, long to, byte[] fileBytes, long mid, int timeout, CallbackData callback)
: 发送文件mtype
: (byte) 消息类型to
: (long) 接收者 idfileBytes
: (byte[]) 要发送的文件mid
: (long) 消息 id, 用于过滤重复消息, 非重发时为0
timeout
: (int) 超时时间(ms)callback
: (CallbackData) 回调方法cbd
: (CallbackData)payload
: (IDictionary(mtime:long))exception
: (Exception)mid
: (long)
-
SendGroupFile(byte mtype, long gid, byte[] fileBytes, long mid, int timeout, CallbackData callback)
: 发送文件mtype
: (byte) 消息类型gid
: (long) Group idfileBytes
: (byte[]) 要发送的文件mid
: (long) 消息 id, 用于过滤重复消息, 非重发时为0
timeout
: (int) 超时时间(ms)callback
: (CallbackData) 回调方法cbd
: (CallbackData)payload
: (IDictionary(mtime:long))exception
: (Exception)mid
: (long)
-
SendRoomFile(byte mtype, long rid, byte[] fileBytes, long mid, int timeout, CallbackData callback)
: 发送文件mtype
: (byte) 消息类型rid
: (long) Room idfileBytes
: (byte[]) 要发送的文件mid
: (long) 消息 id, 用于过滤重复消息, 非重发时为0
timeout
: (int) 超时时间(ms)callback
: (CallbackData) 回调方法cbd
: (CallbackData)payload
: (IDictionary(mtime:long))exception
: (Exception)mid
: (long)