예제 #1
0
파일: Server.cs 프로젝트: smilebing/UDPIM
        /// <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;
            }
        }
예제 #2
0
        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);
            }
        }