protected override void OnMessage(MessageEventArgs e) { base.OnMessage(e); if (e.IsPing) { WsCommonService.ActiveMinerStudioSession(base.SessionId); return; } WsMessage wsMessage = e.ToWsMessage <WsMessage>(); WsCommonService.HandleMinerStudioMessage(this, wsMessage); }
public static T ToWsMessage <T>(this MessageEventArgs e) where T : WsMessage { // IsPing、IsBinary、IsText三者是互斥的,经查源码实际上是判断一个Opcode枚举类型的值 if (e.IsPing) { throw new InvalidProgramException("Ping消息不应走到这一步"); } if (e.IsBinary) { return(VirtualRoot.BinarySerializer.Deserialize <T>(e.RawData)); } else { return(WsCommonService.ParseWsMessage <T>(e.Data)); } }
public SharpWsServer(IHostConfig config) { _wsServer = new WebSocketServer($"ws://0.0.0.0:{config.GetServerPort().ToString()}") { KeepClean = true, AuthenticationSchemes = AuthenticationSchemes.Basic, // 用基本验证字段承载签名信息,因为传输的并非原始密码,所以虽然是基本验证但不存在安全问题 UserCredentialsFinder = id => { string base64String = id.Name; if (!WsRoot.TryGetUser(base64String, out WsUserName wsUserName, out UserData userData, out string _)) { return(null); } string password = WsCommonService.GetUserPassword(wsUserName, userData); password = HashUtil.Sha1(base64String + password); // 经验证username对于基本验证来说没有用 return(new NetworkCredential(userData.LoginName, password, domain: null, roles: wsUserName.ClientType.GetName())); } }; _wsServer.AddWebSocketService <MinerClientSharpWsSessionAdapter>(WsRoot.MinerClientPath); _wsServer.AddWebSocketService <MinerStudioSharpWsSessionAdapter>(WsRoot.MinerStudioPath); MinerClientWsSessionsAdapter = new SharpWsSessionsAdapter(_wsServer.WebSocketServices[WsRoot.MinerClientPath].Sessions); MinerStudioWsSessionsAdapter = new SharpWsSessionsAdapter(_wsServer.WebSocketServices[WsRoot.MinerStudioPath].Sessions); }
protected override void OnClose(CloseEventArgs e) { base.OnClose(e); WsCommonService.RemoveMinerStudioSession(base.SessionId); }
// 查源码可知基类的OnOpen、OnMessage、OnError、OnClose都是空,调用基类对应方法是为了避免第三方代码将来改动 protected override void OnOpen() { base.OnOpen(); WsCommonService.AddMinerStudioSession(this); }