/// <summary> /// 解析客户端数据 /// </summary> /// <param name="s_data"></param> static void ParseClientData(Client CT, string msg) { string data = msg; string type; try { type = data.Substring(0, 2); } catch { type = ""; } string result = ""; switch (type) { //注册 case "RG": result = AccountManagement.getInstance().Register(data); CT.Send(result); break; //登录 case "LG": result = AccountManagement.getInstance().Login(data); if (result.Split(' ')[1].CompareTo("S") == 0) { CT.ID = result.Split(' ')[2]; CT.isLogin = true; } CT.Send(result); break; //创建房间 case "CR": RoomManagement.getInstance().Parse(CT, data); break; //进入房间 case "ER": RoomManagement.getInstance().Parse(CT, data); break; //心跳 case "HB": CT.updateTick(ServerFunction.getTimeStamp()); break; case "": CT.isLink = false; break; default: break; } }
/// <summary> /// 接收连接回调 /// </summary> /// <param name="ar"></param> static void Callback_Accpet(IAsyncResult ar) { Socket t_socket = (Socket)ar.AsyncState; Client new_Client = new Client(); new_Client.isLink = true; new_Client.socket = t_socket.EndAccept(ar); new_Client.lastTick = ServerFunction.getTimeStamp(); new_Client.IPandPort = new_Client.socket.RemoteEndPoint.ToString(); Console.WriteLine(new_Client.socket.RemoteEndPoint.ToString() + " 连接"); new_Client.socket.BeginReceive(new_Client.data, 0, new_Client.data.Length, SocketFlags.None, new AsyncCallback(Callback_Receive), new_Client); ClientList.Add(new_Client); t_socket.BeginAccept(Callback_Accpet, t_socket); }
/// <summary> /// 检查客户端心跳 /// </summary> static void checkClient() { while (true) { for (int i = ClientList.Count - 1; i >= 0; i--) { if (i >= ClientList.Count) { continue; } long t = ClientList[i].lastTick; //超时 if (ServerFunction.getTimeStamp() - t > maxHeartBeatWaitTime || !ClientList[i].isLink) { CloseClient(ClientList[i]); } } //Console.WriteLine("已连接:" + ClientList.Count); Thread.Sleep(100); } }
/// <summary> /// 更新心跳 /// </summary> /// <param name="msg"></param> /// <param name="player"></param> void ParseHeartbeat(string msg, PlayerData player) { player.client.updateTick(ServerFunction.getTimeStamp()); }