You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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返回值传给了方法,直接触发类型转换报错

正确实现逻辑

实现客户端服务端收发消息只需要三步:

  1. 服务端/客户端初始化SocketMessageLayer后,提前注册对应类型的消息接收回调
  2. 调用Send方法发送对应类型的消息
  3. 注册的回调会在收到对应类型消息时自动执行

修正后完整代码示例

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;
}

测试流程

  1. 先调用Server()启动服务端
  2. 再调用Client()启动客户端
  3. 客户端调用await SendMessage("ClientSendToServer")发消息
  4. 服务端的OnStringMessageReceived会自动触发,receivedStr会被赋值为客户端发的内容

内容的提问来源于stack exchange,提问作者MilitaryG

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 18:36:03