C# Stride3D中SocketMessageLayer的AddPacketHandler调用报错问题
问题修正方案
报错根本原因
- 你混淆了
AddPacketHandler<T>和Send两个API的作用:AddPacketHandler<T>是提前注册接收消息的回调函数的方法,返回值为void,不能用await调用;而Send是单独的发消息方法,两者不需要绑定在一起调用 - 你传入的
SomeFunction签名不符合要求:AddPacketHandler<T>要求第一个参数是Func<T, Task>类型的异步回调,也就是输入参数为收到的T类型消息,返回值为Task,你写的SomeFunction返回void、参数也不匹配,调用时直接执行了SomeFunction把void返回值传给了方法,直接触发类型转换报错
正确实现逻辑
实现客户端服务端收发消息只需要三步:
- 服务端/客户端初始化
SocketMessageLayer后,提前注册对应类型的消息接收回调 - 调用
Send方法发送对应类型的消息 - 注册的回调会在收到对应类型消息时自动执行
修正后完整代码示例
string receivedStr = "example"; public SimpleSocket SS = new SimpleSocket(); public SocketMessageLayer SML; // 服务端初始化 public void Server() { SS.StartServer(21, false, 1); SML = new SocketMessageLayer(SS, true); // 初始化时就注册string类型消息的接收回调 SML.AddPacketHandler<string>(OnStringMessageReceived, false); } // 客户端初始化 public void Client() { SS.StartClient("127.0.0.1", 21, true); SML = new SocketMessageLayer(SS, false); // 客户端也可以提前注册服务端返回的消息回调 SML.AddPacketHandler<string>(OnStringMessageReceived, false); } // 发消息方法,只负责发消息 public async Task SendMessage(string str) { await SML.Send(str); } // 符合要求的异步消息处理回调,参数是收到的string消息,返回Task public async Task OnStringMessageReceived(string receivedMessage) { // 这里处理收到的消息 receivedStr = receivedMessage; // 如果是服务端收到消息,可以在这里给客户端回消息 // await SML.Send("收到你的消息了:" + receivedMessage); // 没有异步逻辑的话就返回CompletedTask就行 await Task.CompletedTask; }
测试流程
- 先调用
Server()启动服务端 - 再调用
Client()启动客户端 - 客户端调用
await SendMessage("ClientSendToServer")发消息 - 服务端的
OnStringMessageReceived会自动触发,receivedStr会被赋值为客户端发的内容
内容的提问来源于stack exchange,提问作者MilitaryG
相关产品推荐
相关产品推荐

