小白学习贴: C# TCP服务器

来源:互联网 发布:vevo lazr软件下载 编辑:程序博客网 时间:2024/06/05 11:01

刚入行3周,boss让我写个TCP服务器+客户端…
只是单纯实现功能,等经验丰富后会回头来优化
用户登录的时候是通过Redis缓存服务器来判断,现在还没有接触到和MySQL交互.
如果有大牛经过,劳烦你指出不足

            //主函数入口            IRedisClient Redis = RedisManager.GetClient();            listerSocket = new Socket(AddressFamily.InterNetwork,SocketType.Stream,     ProtocolType.Tcp);            listerSocket.Bind(new IPEndPoint(IPAddress.Parse("127.0.0.1"), 6523));            listerSocket.Listen(4);            Console.WriteLine("服务器已启动");            OnLoginQuestEvent += new LoginDel(OnLogin);            while (true)            {                Console.WriteLine("服务器正在等待连接");                Socket socketConn = listerSocket.Accept();                socketDic.Add(socketConn.RemoteEndPoint.ToString(), socketConn);                Console.WriteLine("服务器连接成功");                Thread thr = new Thread(RecMsg);                thr.IsBackground = true;                thr.Start(socketConn);                try                {                    thrDic.Add(socketConn.RemoteEndPoint.ToString(), thr);                }                catch (System.Exception e)                {                    Console.WriteLine(e.ToString());                }            }        /// <summary>        /// 处理数据        /// </summary>        /// <param name="socket"></param>        static void RecMsg(object socket)        {            Socket clientSocket = (Socket)socket;            bool isQuest = true;//每人一个            while (true)            {                byte[] arrMsgRec = new byte[1024 * 1024];                int len = 0;                try                {                    Console.WriteLine("正在等待" + clientSocket.RemoteEndPoint.ToString() + "用户的输入");                    len = clientSocket.Receive(arrMsgRec, len, arrMsgRec.Length - len, SocketFlags.None);                    string count = Encoding.UTF8.GetString(arrMsgRec, 0, len);                    Console.WriteLine(clientSocket.RemoteEndPoint.ToString() + ":\t" + count);                    if (count != "ok")                    {                        Console.WriteLine(isQuest);                        if (isQuest)                        {                            if (OnLoginQuestEvent != null)                            {                                OnLoginQuestEvent(clientSocket, count, ref isQuest);                            }                        }                    }                    else                    {                        isQuest = false;                    }                }                catch (SocketException se)                {                    Console.WriteLine(se.Message);                    socketDic.Remove(clientSocket.RemoteEndPoint.ToString());                    thrDic.Remove(clientSocket.RemoteEndPoint.ToString());                    break;                }            }        }        /// <summary>        /// 效验密码        /// </summary>        /// <param name="socket"></param>        /// <param name="str"></param>        public static void OnLogin(Socket socket, string str, ref bool isQuest)//改变用户的isQuest        {            JsonData jsonData = JsonMapper.ToObject(File.ReadAllText("Puser.txt"));            foreach (JsonData temp in jsonData)            {                JsonData idValue = temp["id"];                JsonData nameValue = temp["name"];                JsonData passworld = temp["passworld"];                JsonData WhetherCon = temp["WhetherCon"];                int id = int.Parse(idValue.ToString());                string uname = nameValue.ToString();                string pwd = passworld.ToString();                string wcon = WhetherCon.ToString();                using (var redisClient = RedisManager.GetClient())                {                    var user = redisClient.As<User>();                    var newUser = new User                    {                        Id = Convert.ToInt32(user.GetNextSequence()),                        Name = uname,                        passworld = pwd,                        WhetherCon = wcon                    };                    user.Store(newUser);                }                if (socket != null && str != null)                {                    JObject jo = (JObject)JsonConvert.DeserializeObject(str);                    string name = jo["Name"].ToString();                    string pwas = jo["passworld"].ToString();                    string WerCon = jo["WhetherCon"].ToString();                    using (var redisClient = RedisManager.GetClient())                    {                        var user = redisClient.As<User>();                        var userList = user.GetAll().Where(b => b.Name.Contains(name)).ToList();                        if (userList.Count > 0)                        {                            for (int i = 0; i < userList.Count; i++)                            {                                if (userList[i].passworld == pwas && userList[i].WhetherCon != "1")                                {                                    userList[i].WhetherCon = "1";                                    User ss = new User();                                    userList[i].WhetherCon = "1";                                    Console.WriteLine("登录成功");                                    socket.Send(Encoding.UTF8.GetBytes("CanConnection"));                                    isQuest = false;                                    break;                                }                            }                            if (isQuest == true)                            {                                Console.WriteLine("登录失败");                                socket.Send(Encoding.UTF8.GetBytes("notConnection"));                            }                        }                    }                }            }        }
原创粉丝点击