void _client_StateChanged(object sender, ClientStateEventArgs e) { Deployment.Current.Dispatcher.BeginInvoke(() => { ClientState = e.State; }); }
public static void HandleReceivedPackages(ClientStateEventArgs e, Action <ClientStateEventArgs, IProtocolInfo> handleInnerProtocol) { string msg = string.Empty; if (e.LastPackages != null && e.LastPackages.Count > 0) { // 遍历接收到的多个封包数据 foreach (var package in e.LastPackages) { // 打开一个封包的内容,如果返回的结果为null,表示协议未知或者未能正常解析 IProtocolInfo protocol = ServerManager.DefaultPackageDealer.Open(package); if (protocol != null) { if (handleInnerProtocol != null) { handleInnerProtocol.BeginInvoke(e, protocol, null, null); } } else { logger.Debug("协议未知或者未能正常解析。"); } } } else { msg = e.LastReceivedMessage; logger.Debug("非协议消息" + msg); } }
private static void TcpServer_MessageReceivedPreset(object sender, ClientStateEventArgs e) { //HandleReceivedPackages(e, (context, protocol) => //{ // Console.WriteLine(protocol.ToString()); //}); }
// 接收到客户端消息 private static void Events_MessageReceived(object sender, ClientStateEventArgs e) { ServerManager.HandleReceivedPackages(e, (context, protocol) => { ProtocolTypes type = ProtocolTypes.FromValue(protocol.cmd); // 收到学生连接请求 if (type == ProtocolTypes.S2T_Connect) { // 验证是否当前课堂的学生 var valid = DoFirstValidation(context, protocol); // 保持连接, 发送锁屏命令 if (valid) { T2S_LockScreenInfo proc = new T2S_LockScreenInfo(); proc.msg.state = 1; ServerManager.Send(proc); } } // debug //var package = ServerManager.DefaultPackageDealer.Seal(protocol); //logger.Debug("收到消息 :" + protocol.ToString()); //logger.Debug(package.ToString()); }); }
// 客户端连接 private static void Events_ClientConnected(object sender, ClientStateEventArgs e) { e.ClientProxy.ValidatingHandler += (a) => { return(true); }; //logger.Info(string.Format("客户端 {0} 连接成功 ", e.ClientEndPoint)); }
private static void Events_ClientDisconnected(object sender, ClientStateEventArgs e) { Console.WriteLine(e.ClientEndPoint.ToString() + "断线了"); // 更新学生在线状况 var device = ServerManager.StudentDevices; if (device != null) { var student = device.Keys.FirstOrDefault(p => p.StudentBusinessId == e.ClientProxy.BusinessID); if (student != null) { student.IsOnline = false; } } }
static void SkypeManager_ClientStateChanged(object sender, ClientStateEventArgs e) { // The ShuttingDown event doesn't seem to actually get fired when Skype exits. // Need to poll the client to see if it is active, that's the only way to tell if // it actually exited. Console.WriteLine(e.NewState); switch (e.NewState) { case ClientState.SignedOut: skypeRetryTimer = new Timer(CheckIfSkypeExited, null, 5000, 5000); break; case ClientState.SignedIn: skypeRetryTimer?.Dispose(); break; } }
private static void TcpServer_ConnectedPreset(object sender, ClientStateEventArgs e) { //Console.WriteLine(string.Format(" **** {0} 客户{1} 连接上了 **** ", DateTime.Now.ToString("HH:mm:ss"), e.ClientEndPoint)); }
private static void TcpServer_MessageSendPreset(object sender, ClientStateEventArgs e) { //Console.WriteLine("发送了一条消息"); }
private void Client_OnClientEvent(ClientStateEventArgs args) => OnClientStatusChanged?.Invoke(args);
private static void Events_MessageSend(object sender, ClientStateEventArgs e) { Console.WriteLine("发送了一条消息 " + e.LastPackages.Last().ToString()); }
/// <summary> /// 验证学生 /// </summary> /// <param name="e"></param> /// <param name="info"></param> private static bool DoFirstValidation(ClientStateEventArgs e, IProtocolInfo info) { S2T_ConnectInfo connectInfo = info as S2T_ConnectInfo; // 新的客户端 var ThisClient = e.ClientProxy; // 新的学生编号 var ThisBusinessId = connectInfo.msg.sId; // 全局的学生清单 var StudentDevices = ServerManager.StudentDevices; lock (StudentDevices) { // 查询学生清单中是否存在对应编号的学生 Student key = StudentDevices.Keys.FirstOrDefault(p => p.StudentBusinessId == ThisBusinessId); if (key != null) { var ValueClient = StudentDevices[key]; if (ValueClient == null) { // 如果不存在,则关联学生对象和客户端对象 StudentDevices[key] = ThisClient; ThisClient.BusinessID = key.StudentBusinessId; // 关联业务ID,以便下次作比较 // 2019-04-16 mzc //e.BusinessId = ThisBusinessId; key.IsOnline = true; Console.WriteLine($"学生{key.RealName}连接上了"); } else { // 如果已存在,判断客户端列表里是否有相同ID的连接(比较业务ID,如果相同,则断开之前的连接) if (ValueClient.BusinessID.ToDefaultString() == ThisBusinessId) { var lastClient = StudentDevices[key]; //todo: 改为发命令 //ServerManager.Recycle(lastClient.ReceiveContext); Console.WriteLine("同一学生重复连接,回收之前的一个连接,并保留当前连接。"); } StudentDevices[key] = ThisClient; ThisClient.BusinessID = key.StudentBusinessId; key.IsOnline = true; // 2019-04-16 mzc //e.BusinessId = ThisBusinessId; } return(true); } else { // 如果连接上来的不是该班级的学生,则断开连接 ServerManager.Recycle(e.ClientSocketContext); return(false); } } }