C#Sockets编程实现群聊

服务器:

class Server
    {
        List<Socket> userList = new List<Socket>();
        Socket socket;
        public Server(string ip, int port)
        {
            socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);//为服务器创建Socket,
            IPAddress ipAdd;
            if (!IPAddress.TryParse(ip, out ipAdd))//将ip转换成IP地址格式放到ipAdd里
            {
                Console.WriteLine("地址有误,创建服务器失败");
            }
            IPEndPoint ipAndPo = new IPEndPoint(ipAdd, port);//获得IP和端口号
            socket.Bind(ipAndPo);//绑定IP和端口号并关联
            Console.WriteLine("服务器创建成功");
            socket.Listen(0);//建立监听,0表示可连接的客户端数,0的时候表示无限

            Console.WriteLine("等待用户连接。。。。。");
        }

        public void Start()
        {
            Thread t1 = new Thread(AcceptUsers);


            t1.Start();

            this.SendMessage();
        }
        /// <summary>
        /// 客户端连接方法
        /// </summary>
        public void AcceptUsers()
        {
            while (true)
            {
                Socket user = socket.Accept();//为新的连接创建Socket
                userList.Add(user);//将新的连接放入List

                Thread t2 = new Thread(ReceiveMessage);//为新的连接开启新的线程
                Console.WriteLine("客户端{0}连接", t2.ManagedThreadId);
                t2.Start(user);
            }
        }
        /// <summary>
        /// 发送消息
        /// </summary>
        public void SendMessage()
        {
            while (true)
            {
                if (userList.Count > 0)
                {
                    string str = Console.ReadLine();
                    byte[] brr = Encoding.Default.GetBytes(str);
                    for (int i = 0; i < userList.Count; i++)
                    {
                        try
                        {
                            userList[i].Send(brr);
                        }
                        catch (Exception)
                        {
                            userList.RemoveAt(i);
                            i--;
                        }

                    }
                }
            }
        }
        /// <summary>
        /// 接收消息并群发
        /// </summary>
        /// <param name="user"></param>
        public void ReceiveMessage(object user)
        {
            while (true)
            {


                byte[] brr = new byte[1024 * 100];
                int num;
                string str;
                try
                {
                    num = ((Socket)user).Receive(brr);
                    str = Encoding.Default.GetString(brr, 0, num);
                    Console.WriteLine("客户端{0}:{1}", Thread.CurrentThread.ManagedThreadId, str);
                }
                catch (Exception)
                {
                    Console.WriteLine("客户端{0}下线", Thread.CurrentThread.ManagedThreadId);
                    Thread.CurrentThread.Abort();
                    return;
                }
                str = "客户端" + Thread.CurrentThread.ManagedThreadId.ToString()+":" + str;
                brr = Encoding.Default.GetBytes(str);
                for (int i = 0; i < userList.Count; i++)
                {
                    try
                    {
                        userList[i].Send(brr);
                    }
                    catch (Exception)
                    {
                        userList.RemoveAt(i);
                        i--;
                    }

                }


            }
        }
    }

客户端:

class Client
    {
        Socket socket;
        bool isConnect = false;
        public Client(string ip,int port)
        {
            socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);//建立socket
            IPAddress ipAdd = IPAddress.Parse(ip);
            IPEndPoint ipAndPo = new IPEndPoint(ipAdd, port);
            try
            {
                socket.Connect(ipAndPo);
                Console.WriteLine("连接服务器");
            }
            catch (Exception)
            {

                Console.WriteLine("服务器连接失败");
            }
        }

        public void Start()
        {
            Thread t = new Thread(SendMessage);
            t.Start();
            ReceiveMessage();
        }

        public void SendMessage()
        {
            while (isConnect)
            {
                string str = Console.ReadLine();
                try
                {
                    byte[] brr = Encoding.Default.GetBytes(str);
                    socket.Send(brr);
                }
                catch (Exception)
                {

                    Console.WriteLine("与服务器断开");
                    Thread.CurrentThread.Abort();
                    return;
                }
            }
        }

        public void ReceiveMessage()
        {
            while (isConnect)
            {
                byte[] brr = new byte[1024 * 100];
                try
                {
                    int num = socket.Receive(brr);
                    string str = Encoding.Default.GetString(brr, 0, num);
                    Console.WriteLine("---" + str);
                }
                catch (Exception)
                {

                    Console.WriteLine("与服务器断开");
                    //Thread.CurrentThread.Abort();
                    return;
                }
            }
        }
    }

猜你喜欢

转载自blog.csdn.net/weixin_42446849/article/details/81230952