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

刚入行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"));
                            }
                        }

                    }
                }

            }
        }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值