• 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客户端连接
    "));
                }
                catch (Exception ex)
                {
                    richMsg.AppendText(string.Format("服务器启动失败,错误原因:{0}
    ", ex.Message));
                }
                AcceptUser();
            }
    
            /// <summary>
            /// 接受用户连接
            /// </summary>
            private void AcceptUser()
            {
                while (true)
                {
                    try
                    {
                        Socket nowClient = server.Accept();
                        userSocket[socketNum++] = nowClient;
                        userNum++;
                        richMsg.AppendText(string.Format("有新的用户接入,当前在线用户数:{0}
    ", userNum));
    
                        Thread nowThread = new Thread(new ParameterizedThreadStart(ReciveData));
                        nowThread.Start(nowClient);
                    }
                    catch (Exception ex)
                    {
                        richMsg.AppendText(string.Format("新用户接入失败:错误原因:{0}
    ", 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}
    ", str));
    
                        byte[] data = Encoding.UTF8.GetBytes(str);
                        SendAllUser(data, nowClient);
                    }
                    catch (Exception ex)
                    {
                        richMsg.AppendText(string.Format("接收用户消息失败:错误原因:{0}
    ", 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("消息转发成功!
    "));
                        }
                        catch (Exception ex)
                        {
                            userSocket[i] = userSocket[socketNum - 1];
                            socketNum--;
                            i--;
                            richMsg.AppendText(string.Format("用户断线,当前在线用户数:{0},断线原因:{1}
    ", socketNum, ex.Message));
                        }
                    }
                }
            }
        }
    
  • 相关阅读:
    抓住大数据的3个核心点 走在爆款前面
    小白学数据分析--回归分析在游戏人气分析的应用探索
    小白学数据分析--回归分析在游戏人气分析的应用探索
    Linux,unix,cygwin,centeros下的tar压缩解压缩命令具体解释
    二:Java之异常处理
    BEGINNING SHAREPOINT&#174; 2013 DEVELOPMENT 第14章节--使用Office Services开发应用程序 WOPI和新的Office Web Apps Server
    Git 的BUG小结
    android:json解析的两个工具:Gson和Jackson的使用小样例
    Cocos2d-x3.0终于版Mac以及Win系统相关环境部署
    第五十六题(最长公共子串)
  • 原文地址:https://www.cnblogs.com/kinger906/p/3426836.html
Copyright © 2020-2023  润新知