Unity实时通信发送消息错误

sendmessageasync()连续发送消息正常,但间隔半分钟之后再发一条,会显示错误码SESSION_REQUIRED,用createconversationasync()创建的对话,对话链接中断频繁,文档上说明需要open session,请问一下C#版怎么去做,没找到相关接口

如果连接断开,会有对应的「断线事件」
请粘贴一下相关日志,用于排查发送错误的原因

(Filename: /Users/builduser/buildslave/unity/build/artifacts/generated/common/runtime/DebugBindings.gen.cpp Line: 51)

2020-01-07 17:37:40.661 27913-28324/? I/Unity: auto heart beating ticked by timer.

(Filename: /Users/builduser/buildslave/unity/build/artifacts/generated/common/runtime/DebugBindings.gen.cpp Line: 51)

2020-01-07 17:37:40.674 27913-27952/? I/Unity: websocket=>{}

(Filename: /Users/builduser/buildslave/unity/build/artifacts/generated/common/runtime/DebugBindings.gen.cpp Line: 51)

2020-01-07 17:37:40.674 27913-27952/? I/Unity: DefaultWebSocketClient.OnMessage event add with 13 times

(Filename: /Users/builduser/buildslave/unity/build/artifacts/generated/common/runtime/DebugBindings.gen.cpp Line: 51)

2020-01-07 17:37:40.759 27913-28326/? I/Unity: websocket<={}

(Filename: /Users/builduser/buildslave/unity/build/artifacts/generated/common/runtime/DebugBindings.gen.cpp Line: 51)

2020-01-07 17:38:01.349 27913-27952/? I/Unity: --------------- SendMessageToLeanCloud user: development_13 chat_name: henry111 chat_type: 1 chat_msg: 大家好

(Filename: /Users/builduser/buildslave/unity/build/artifacts/generated/common/runtime/DebugBindings.gen.cpp Line: 51)

2020-01-07 17:38:01.351 27913-27952/? I/Unity: AVIMClient.OnMessageReceived event add with 3 times

(Filename: /Users/builduser/buildslave/unity/build/artifacts/generated/common/runtime/DebugBindings.gen.cpp Line: 51)

2020-01-07 17:38:01.352 27913-27952/? I/Unity: begin to attach singature.

(Filename: /Users/builduser/buildslave/unity/build/artifacts/generated/common/runtime/DebugBindings.gen.cpp Line: 51)

2020-01-07 17:38:01.355 27913-28352/? I/Unity: websocket=>{"cid":null,"attr":{"name":""},"m":["DEVG29"],"transient":false,"tempConv":false,"unique":true,"i":-65510,"cmd":"conv","appId":"vodmE5jFIXnvXu35iMmu4801-gzGzoHsz","op":"start","peerId":"development_13@boltrendgames.com"}

(Filename: /Users/builduser/buildslave/unity/build/artifacts/generated/common/runtime/DebugBindings.gen.cpp Line: 51)

2020-01-07 17:38:01.355 27913-28352/? I/Unity: DefaultWebSocketClient.OnMessage event add with 14 times

(Filename: /Users/builduser/buildslave/unity/build/artifacts/generated/common/runtime/DebugBindings.gen.cpp Line: 51)

2020-01-07 17:38:01.410 27913-28354/? I/Unity: websocket<={"reason":"SESSION_REQUIRED","code":4105,"cmd":"error","appId":"vodmE5jFIXnvXu35iMmu4801-gzGzoHsz","peerId":"development_13@boltrendgames.com","i":-65510,"service":2}

(Filename: /Users/builduser/buildslave/unity/build/artifacts/generated/common/runtime/DebugBindings.gen.cpp Line: 51)

2020-01-07 17:38:01.425 27913-28354/? I/Unity: DefaultWebSocketClient.OnMessage event remove with 13 times

(Filename: /Users/builduser/buildslave/unity/build/artifacts/generated/common/runtime/DebugBindings.gen.cpp Line: 51)

2020-01-07 17:38:01.475 27913-27952/? E/Unity: AVIMException: SESSION_REQUIRED
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw () [0x0000c] in :0
at LeanCloud.Storage.Internal.InternalExtensions+<>c__DisplayClass7_0`1[TResult].b__0 (System.Threading.Tasks.Task t) [0x00033] in <179a75b7fa894ee0b895182963eead4d>:0
at System.Threading.Tasks.ContinuationResultTaskFromTask`1[TResult].InnerInvoke () [0x00024] in :0
at System.Threading.Tasks.Task.Execute () [0x00010] in :0
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw () [0x0000c] in :0
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess (System.Threading.Tasks.Task task) [0x0003e] in :0
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (System.Threading.

有监听avimclient的OnSessionClosed事件,但没收到session关闭的回调,open需要重新建立一个新的对话吗,还是通过调用什么接口去重新激活当前对话

发送消息代码如下:

var msg = new AVIMTypedMessage();
msg["userNo"] = "";
msg["userName"] = "";
msg["userIconID"] = "";
msg["messageType"] = "";
msg["timestamp"] = NowServerDateTime().ToLocalTime().ToString("s");
msg.TextContent = "";

var selfClient = await realtime.CreateClientAsync(userID);
var conversation = await selfClient.CreateConversationAsync(roomID);
await conversation.SendMessageAsync(msg).ContinueWith(task =>
{
if (task.Exception != null)
{
UnityEngine.Debug.Log("------------------- " + task.Exception.ToString());
}
else if (task.IsCompleted)
{

}

});

这个代码没看太明白。
是每次发消息都重新创建了 client,conversation 吗?
另外,SendMessageAsync() 既然 await 了,就不用再 ContinueWith() 了。
方便的话,可以上传一个示例工程我来看一下。

之前只创建一次client,一个conversation,看到这个错误后刚才试了试每次都重新建,没报错,但不符需要。

内容比较多,不是很方便拉出示例工程。 continuewith是framework4.0之前的写法吗?

一个客户端最好是一个 AVRealtime,一个 AVIMClient,进行消息的发送和接收。
上述代码中 continueWith() 会导致回调不在主线程,需要提供 TaskScheduler 才能返回主线程。
RTM 服务启动后,如果出现断线情况,会自动重连。
可以尝试根据文档编写一个最简单的复现问题的 demo,也可以简化使用用法,排查错误。

好的,谢谢,我先试一试

是这样的,创建了两个Client,比如Client A和Client B,建立一个新对话,这时候client A对client B发了一条消息,用GetQuery().WhereEqualTo().FindAsync() 去查询Client B的消息记录之后,再用Client A使用当前对话或者创建新对话去发送消息,就会出现SESSION_REQUIRED的错误,发送失败,必现的,请问一下是哪里做法不对吗

直接用当前conversation对象调用QueryMessageAsync()去查询记录不会报错

Client A 和 Client B 是在一个客户端进程中创建的吗?

是的,一个进程里

之前创建聊天室,一个client发消息,其他client joinAsync()加入后收不到消息回调,就用了这种方法,建一个公共的client,公共的对话,所有成员都和这个公共的client建立conversation对话,就都能收到了,然后就出现了这个问题

目前 SDK 不支持多用户,请在一个进程中只有一个 Client。
可以通过打包和 Unity Editor 互相发消息。

请问有创建聊天室的例子吗,按照文档上,创建conversation对话是可以收到一方发送消息的回调,这方法必须知道对方的userid; 如果是创建聊天室createchatroom,其他client调用joinasync之后,onmessagereceived接收不到

比如文档里的tom.CreateChatRoomAsync("聊天室"); 如果另外个用户不知道是tom创建的,var query = tom.GetChatRoomQuery();该怎么找到这个聊天室并加入,因为一个进程里只能有一个client,需求类似公会里聊天一样,每个用户进来不需要知道其他用户的id

firebase的做法是可以直接访问操作realtimedatebase,读写消息,lc怎么实现会容易些

tom.GetChatRoomQuery() 是获取 tom 的查询对象。
一般一个公会会有自己的聊天频道(聊天室),可以将这个聊天室的 ID 记录到「公会」数据中,加入公会之后,根据聊天室 ID 加入到聊天频道。

这个问题我确实没有看明白。
在收到的消息对象中,是包含会话 ID,发送者 ID 等信息的。

创建聊天室,现在是收不到消息的,会话id和发送者id都是在收到消息之后能拿到