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));
                    }
                }
            }
        }
    }

 

转载于:https://www.cnblogs.com/kinger906/p/3426836.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值