/// <summary> /// 处理接收过来的数据,msg 为json类型 /// </summary> /// <param name="msg"></param> /// <param name="remoteIPEndPoint"></param> private void handleMsg(string msgStr, IPEndPoint remoteIPEndPoint) { //{ // "from":"username", // "to":"username", // "type":"text/img/file", // "content":"......" //} //获取消息类 MyMessage receiveMsg = JsonConvert.DeserializeObject <MyMessage>(msgStr); switch (receiveMsg.type) { case "heart": //心跳包 MyIPEndPoint myIPEndPoint = new MyIPEndPoint(); myIPEndPoint.ip = remoteIPEndPoint.Address.ToString(); myIPEndPoint.port = remoteIPEndPoint.Port; myIPEndPoint.createTime = System.DateTime.Now; OnlineUsers onlineUsers = OnlineUsers.getInstance(); onlineUsers.users.AddOrUpdate(receiveMsg.from, myIPEndPoint, (k, v) => v); //将在线用户的信息反馈给用户 //构造消息 MyMessage msgObject = new MyMessage(); msgObject.from = "server"; msgObject.to = "client"; msgObject.type = "heartFeedBack"; msgObject.content = ""; msgObject.users = onlineUsers.users; sendMsg(msgObject, remoteIPEndPoint); Console.WriteLine("server send:" + JsonConvert.SerializeObject(msgObject)); break; case "login": //测试阶段 登录不验证账号密码 MyMessage feedBackMsg = new MyMessage(); feedBackMsg.from = "server"; feedBackMsg.to = receiveMsg.from; feedBackMsg.type = "login"; feedBackMsg.content = "true"; sendMsg(feedBackMsg, remoteIPEndPoint); break; case "register": break; } }
public void refresh() { while (true) { DateTime now = System.DateTime.Now; //遍历在线用户,排除长时间没有发送心跳包的用户 foreach (KeyValuePair <string, MyIPEndPoint> keyValuePair in OnlineUsers.getInstance().users) { DateTime createTime = keyValuePair.Value.createTime; if (now.Second - createTime.Second > HEART_BEAT_TIME) { MyIPEndPoint ipendPoint = new MyIPEndPoint(); //删除 OnlineUsers.getInstance().users.TryRemove(keyValuePair.Key, out ipendPoint); } } Thread.Sleep(REFRESH_ONLINE_USERS_SLEEP_TIME); } }