WebChart网页局域网聊天系列(二):服务器结构及核心代码

    public partial class MainForm : Form

    {

        private Socket server;//服务器Socket

        private int userNum;//当前在线用户数

        private int socketNum;//当前socket数

        private Socket[] userSocket = new Socket[40];//存储用户socket



        public MainForm()

        {

            InitializeComponent();



            Thread startThread = new Thread(new ThreadStart(Listen));

            startThread.Start();

        }



        /// <summary>

        /// 监听

        /// </summary>

        private void Listen()

        {

            userNum = 0;

            socketNum = 0;



            IPEndPoint iep = new IPEndPoint(IPAddress.Parse(ConfigurationManager.AppSettings["serverIp"]), int.Parse(ConfigurationManager.AppSettings["serverPort"]));

            server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

            try

            {

                server.Bind(iep);

                server.Listen(20);

                richMsg.AppendText(string.Format("服务器已启动,等待WEB客户端连接\r\n"));

            }

            catch (Exception ex)

            {

                richMsg.AppendText(string.Format("服务器启动失败,错误原因:{0}\r\n", ex.Message));

            }

            AcceptUser();

        }



        /// <summary>

        /// 接受用户连接

        /// </summary>

        private void AcceptUser()

        {

            while (true)

            {

                try

                {

                    Socket nowClient = server.Accept();

                    userSocket[socketNum++] = nowClient;

                    userNum++;

                    richMsg.AppendText(string.Format("有新的用户接入,当前在线用户数:{0}\r\n", userNum));



                    Thread nowThread = new Thread(new ParameterizedThreadStart(ReciveData));

                    nowThread.Start(nowClient);

                }

                catch (Exception ex)

                {

                    richMsg.AppendText(string.Format("新用户接入失败:错误原因:{0}\r\n", ex.Message));

                }

            }

        }



        /// <summary>

        /// 接收客户端发过来的消息

        /// </summary>

        /// <param name="client"></param>

        private void ReciveData(object client)

        {

            Socket nowClient = (Socket)client;

            while (true)

            {

                int res = 0;

                byte[] bytes = new byte[1024];

                try

                {

                    res = nowClient.Receive(bytes);

                    string str = Encoding.UTF8.GetString(bytes, 0, res);

                    richMsg.AppendText(string.Format("{0}\r\n", str));



                    byte[] data = Encoding.UTF8.GetBytes(str);

                    SendAllUser(data, nowClient);

                }

                catch (Exception ex)

                {

                    richMsg.AppendText(string.Format("接收用户消息失败:错误原因:{0}\r\n", ex.Message));

                }

            }

        }



        /// <summary>

        /// 转发给其他所有用户

        /// </summary>

        /// <param name="data"></param>

        /// <param name="nowClient"></param>

        private void SendAllUser(byte[] data,Socket nowClient)

        {

            if (userNum > 0)

            {

                for (int i = 0; i < socketNum; i++)

                {

                    if (userSocket[i].Equals(nowClient))

                        continue;

                    try

                    {

                        userSocket[i].Send(data);

                        richMsg.AppendText(string.Format("消息转发成功!\r\n"));

                    }

                    catch (Exception ex)

                    {

                        userSocket[i] = userSocket[socketNum - 1];

                        socketNum--;

                        i--;

                        richMsg.AppendText(string.Format("用户断线,当前在线用户数:{0},断线原因:{1}\r\n", socketNum, ex.Message));

                    }

                }

            }

        }

    }

 

你可能感兴趣的:(chart)