Skip to content

客户端服务器之间发送消息

SessionFantasy通讯系统中唯一的通讯方式。发送端通过创建Session与服务器建立连接,并进行数据交换。服务器也会为发送端生成对应的Session,确保一对一的安全通讯。当任意一方销毁Session时,对方将立即接收到通讯断开的通知,确保通讯状态的实时同步。

发送端

Send

该方法用于在发送端与服务器之间进行标准的通信
  • 消息类型: 普通消息,通常用于发送常规数据或请求。
  • 参数: message 表示要发送给服务器的内容,通常是文本或数据包。

Send示例

session.Send(new C2G_TestMessage() { Tag = "Hello C2G_TestMessage" });

Call

该方法用于发送端与服务器之间的远程过程调用(RPC)通信
  • 参数 request: 这是发送端发送给服务器的请求消息,包含发送端希望执行的操作和相关数据。
  • 返回值 response: 服务器处理请求后,将生成一个响应消息并返回给发送端,该响应包含执行结果或错误信息。 服务器会返回一个response消息给发送端

Call示例

// C2G_TestRequest:服务器接收的协议
// G2C_TestResponse:发送端接收到服务器发送的返回消息
var response = (G2C_TestResponse)await _session.Call(new C2G_TestRequest()
{
    Tag = "Hello C2G_TestRequest"
});
Debug.Log($"收到G2C_TestResponse Tag = {response.Tag}");

Dispose

该方法用于销毁会话(Session)。在销毁操作完成后,方法会自动与服务器断开连接,释放相关资源,确保不会再进行任何通信。

Dispose示例

session.Dispose();

服务器

每当发送端创建一个新的Session时,服务器也会相应地为其创建一个一对一对应的Session,并保持这一映射关系,直到发送端断开当前连接,服务器才会终止该Session。这样可以确保每个发送端的Session独立且安全,避免了不同发送端之间的Session混淆。

要在服务器上接收发送端发送的消息,需要定义对应的消息接收器来处理这些消息。

Message

接收发送端发送的标准消息。

需要定义一个类来继承 Message ,Message 接受一个泛型类型:

  • 泛型: T 指定了需要接收消息的类型。

在继承了 Message 类之后,必须实现一个名为 Run 的方法。这个方法接受两个参数:

  • session: 与发送端连接的会话对象,用于维持通信通道的有效性。
  • message: 发送端发送过来的消息数据,类型就是Message后面泛型定义的类型。

Message的示例

public sealed class C2G_TestMessageHandler : Message<C2G_TestMessage>
{
   protected override async FTask Run(Session session, C2G_TestMessage message)
   {
       Log.Debug($"Receive C2G_TestMessage Tag={message.Tag}");
       await FTask.CompletedTask;
   }
}

MessageRPC

接收发送端发送的RPC消息。

需要定义一个类来继承 MessageRPC,MessageRPC 类接受两个泛型类型:

  • 泛型1: TRequest 指定了需要接收消息的类型。
  • 泛型2: TResponse 指定了发送端需要接收消息的类型。

在继承了 MessageRPC 类之后,必须实现一个名为 Run 的方法。这个方法接受四个参数:

  • session: 与发送端连接的会话对象,用于维持通信通道的有效性。
  • request: 发送端发送过来的请求数据,类型由 MessageRPC 类的第一个泛型参数定义。
  • response: 需要返回给发送端的响应数据,类型由 MessageRPC 类的第二个泛型参数定义。
  • reply: 一个用于立即发送 response 消息给发送端的函数。如果不调用 reply,系统会在 Run 方法执行完毕后自动调用它,将 response 发送回发送端。

MessageRPC示例

public sealed class C2G_TestRequestHandler : MessageRPC<C2G_TestRequest, G2C_TestResponse>
{
   protected override async FTask Run(Session session, C2G_TestRequest request, G2C_TestResponse response, Action reply)
   {
       Log.Debug($"Receive C2G_TestRequest Tag = {request.Tag}");
       response.Tag = "Hello G2C_TestResponse";
       await FTask.CompletedTask;
   }
   // 当执行完Run方法后会自动调用reply方法,将response消息发送给发送端。
}

Session

Message 和 MessageRPC 的 Run 方法都接受一个 Session 参数。

通过这个 Session 参数,服务端可以与发送端进行通信,并向发送端发送消息但是不能发送RPC消息。

这个 Session 作为通信的上下文,确保了消息的正确路由和状态管理。

Send

服务器发消息给发送端示例

session.Send(new G2C_TestMessage() { Tag = "Hello G2C_TestMessage" });

群发消息

在 Run 方法中可以使用 List 或 Dictionary 等数据结构,将 Session 对象添加到一个容器中。

  • 可以使用 List 来存储多个 Session 对象,便于按顺序处理或遍历。
  • 如果需要通过特定的键值快速访问某个 Session 对象,使用 Dictionary 会更合适。
  • 这样在后续的业务逻辑中,可以方便地通过遍历 List 或通过键访问 Dictionary 来使用这些 Session 对象。

群发消息示例

var message = new G2C_TestMessage() { Tag = "Hello G2C_TestMessage" };
foreach (var session in sessions)
{
    session.Send(message);
}

断开连接

该方法用于销毁会话(Session)。在销毁操作完成后,方法会自动与发送端断开连接,释放相关资源,确保不会再进行任何通信。

Dispose示例

session.Dispose();