消息处理器
消息处理器类似于 SignalR
的 Hub,是用来接收消息和发送消息的中间件。你只要继承 WebSocketHandler
类然后像 SignalR Hub
一样添加方法即可。如下所示:
public class NotifyHandler : WebSocketHandler
{
// 给所有人发消息
public async Task Notify(string message)
{
await Clients.All.SendAsync("OnNotify", message);
}
// 多参数,返回值,其他人接收
public async Task<string> NotifyAndRet(int msgId, string message)
{
await Clients.Other.SendAsync("OnNotify", message);
return "ok " + msgId;
}
// 接收对象
public async Task<string> NotifyMessage(Message msg)
{
await Clients.All.SendAsync("OnNotify", msg.Content);
return "ok " + msg.MsgId;
}
// 发送给群组
public async Task<string> NotifyToGroup(string group, string message)
{
await Clients.Group(group).SendAsync("OnNotify", message);
return "ok";
}
}
以上的示例中,Handler 收到消息后,会给所有人进行转发。除了使用 All,你还可以使用 Other 给自己之外的其他人进行转发,使用 Group 针对组进行转发。
💡 关于消息的数据协议
WebSocket 消息的协议定义如下:
{ "M": "方法名", "A": [参数列表], "D": 方向(0或1), "R": 是否有返回值(0或1) }
说明:方向 0 表示发送消息,1 表示返回消息。
如以上示例中,对于服务端,各方法所接收到的消息结构如下:
// Task Notify(string message)
{ "M": "Notify", A: ["放假通知:五一放假期间请不要外出。"]}
// Task<string> NotifyAndRet(int msgId, string message)
{ "M": "NotifyAndRet", A: [100222, "放假通知:五一放假期间请不要外出。"]}
// Task<string> NotifyMessage(Message msg)
{ "M": "NotifyMessage", A: [{ "MsgId": 100222, "Content": "放假通知:五一放假期间请不要外出。" }]}
// Task<string> NotifyToGroup(string group, string message)
{ "M": "NotifyToGroup", A: ["同学", "放假通知:五一放假期间请不要外出。"]}
对于对应的客户端,会收到一条消息通知,消息结构如下:
{ "M": "OnNotify", "D": 0, "A": ["放假通知:五一放假期间请不要外出。"], "R": 0}
对于有返回值的方法,客户端还会收到一条 R = 1 的消息,A 中的对象即是返回值。结构如下:
// Task<string> NotifyAndRet(int msgId, string message)
{ "M": "NotifyAndRet", "D": 1, "A": ["ok 100222"], "R": 1 }
// Task<string> NotifyMessage(Message msg)
{ "M": "NotifyMessage", "D": 1, "A": ["ok 100222"], "R": 1 }
消息的序列化反序列化可以通过重新实现 IMessageFormatter
接口并在 WebSocketBuildOption
参数里进行实例化。