溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C#如何基于Socket實現多人聊天功能

發布時間:2022-02-11 10:29:42 來源:億速云 閱讀:204 作者:小新 欄目:開發技術

這篇文章主要介紹C#如何基于Socket實現多人聊天功能,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!

具體內容如下

服務器

服務器負責接受所有客戶端發來的消息,和將接受到的問題群發到其他用戶。

代碼:

using System;
using System.Collections.Generic;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;
namespace ChatRoomService
{
    class Service
    {
        Socket socketSevice ;
        List<Socket> userList;//用戶組
        public Service()
        {
           socketSevice = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
           userList = new List<Socket>();
        }

        public void  Start()
        {
            socketSevice.Bind(new IPEndPoint(IPAddress.Any,5566));
            socketSevice.Listen(10);
            Console.WriteLine("服務器啟動成功");

            //開啟接受連接,用多線程
            Thread accThread = new Thread(Accept);
            accThread.IsBackground = true;
            accThread.Start();
        }

        private void Accept()
        {
            //接受連接
            Socket clientSocket = socketSevice.Accept();
            userList.Add(clientSocket);
            //打印已經連接IP地址
            Console.WriteLine(IPToAddress(clientSocket)+"連接進來了");

            //
            Thread RecvThread = new Thread(ReceMessage);
            RecvThread.IsBackground = true;
            RecvThread.Start(clientSocket);

            Accept();//遞歸
        }
        //接收客戶端信息
        private void ReceMessage(Object obj)
        {
            Socket client = obj as Socket;
            byte[] strByte = new byte[1024 * 1024];//設定接受字符的長度
            string str = "";
            try
            {
              int len = client.Receive(strByte);//接受用戶發送的內容
              str = Encoding.Default.GetString(strByte, 0, len);
              Broadcast(str,client);//廣播給用戶
              Console.WriteLine(str);
             }
             catch (Exception e)
             {
                Console.WriteLine(IPToAddress(client)+"退出");
                userList.Remove(client);
                Thread.CurrentThread.Abort();//退出時掐死線程,不然遞歸反彈
            }
           ReceMessage(client); //使用遞歸
        }

        /// <summary>
        /// 廣播信息
        /// </summary>
        /// <param name="useStr">傳入收到的傳輸的內容</param>
        /// <param name="obj">傳送信息的客戶</param>
        private void Broadcast(string userStr,object obj)
        {
            Socket clientSend = obj as Socket; //當前發送信息的客戶
            foreach (Socket client in userList)
            {
                if (client != clientSend)//將信息廣播給其他用戶
                {
                    client.Send(Encoding.Default.GetBytes(IPToAddress(clientSend)+":"+userStr));
                }
            }
        }        //轉換出連來客戶的IP地址
        private string IPToAddress(Socket soket)
        {
            return (soket.RemoteEndPoint as IPEndPoint).Address.ToString();
        }
    }
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ChatRoomService
{
    class Program
    {
        static void Main(string[] args)
        {
            Service ss = new Service();
            ss.Start();
            Console.ReadLine();
        }
    }
}

客戶端

客戶端的功能開始十分簡單,可以發送信息給服務器。也可以接收服務器轉發過來其他客戶端的信息。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;
using System.Threading.Tasks;

namespace ChatRoom
{
    class ClientRoom
    {
        Socket clientSocket;

        public ClientRoom()
        {
            clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);//初始化服務器
        }
        /// <summary>
        /// 連接服務器
        /// </summary>
        /// <param name="Ip"></param>
        /// <param name="port"></param>
        public void Connected(string Ip,int port)
        {
            clientSocket.Connect(Ip,port);
            Console.WriteLine("連接成功");
            // ClientSocket.Bind(new IPEndPoint());

            Thread RecvThread = new Thread(RecvMessage);
            RecvThread.IsBackground = true;
            RecvThread.Start();
        }

       public void Send(String str)
        {
            clientSocket.Send(Encoding.Default.GetBytes(str));
        }

        /// <summary>
        /// 接受信息
        /// </summary>
        private void RecvMessage()
        {
            try
            {
                byte[] strByte = new byte[500 * 1024];
                int len = clientSocket.Receive(strByte);
                Console.WriteLine(Encoding.Default.GetString(strByte, 0, len));
            }
            catch (Exception e) //服務器關閉
            {
                Console.WriteLine("服務器關閉");
                Thread.CurrentThread.Abort();//關閉時切斷進程
            }
            RecvMessage();
        }        
    }
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ChatRoom
{
    class Program
    {
        static void Main(string[] args)
        {
            ClientRoom client = new ClientRoom();
            client.Connected("127.0.0.1", 5566);
            string str = Console.ReadLine();
            while (!str.Equals("q"))
            {
                client.Send(str);
                str = Console.ReadLine();
            }
            Console.ReadLine();
        }
    }
}

可以正常對話,測試一下。假裝和自己對話

C#如何基于Socket實現多人聊天功能

目前還沒有解決沾包問題

以上是“C#如何基于Socket實現多人聊天功能”這篇文章的所有內容,感謝各位的閱讀!希望分享的內容對大家有幫助,更多相關知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女