.NET 高效能非同步套接字型檔,支援多協議、跨平臺、高併發

小码编匠發表於2024-11-04

前言

.NET 生態中有哪些值得推薦的網路通訊框架?今天,給大家推薦一個非常優秀的開源專案——NetCoreServer。

NetCoreServer 是一款 .NET 開源、免費、快速且低延遲的非同步套接字伺服器和客戶端庫。無論是需要搭建高效能的服務端應用,還是開發高效的客戶端程式,NetCoreServer 都能提供強大的支援。

專案介紹

NetCoreServer 是一個高效能、跨平臺的非同步套接字伺服器和客戶端庫。

它支援多種傳輸協議,包括 TCP、SSL、UDP、HTTP、HTTPS 和 WebSocket,提供了豐富的網路通訊功能。

該庫的設計初衷是解決高併發和低延遲的網路通訊需求,採用了非同步通訊模型,能夠高效處理大量連線和資料傳輸。

提供了豐富的示例包括 TCP 聊天伺服器、SSL 聊天伺服器和 UDP 回顯伺服器等多種應用場景。

專案特性

  • 跨平臺:支援 Linux、macOS 和 Windows。
  • 非同步通訊:利用非同步程式設計模式提高效能和響應性。
  • 多協議支援:支援 TCP、SSL、UDP、HTTP、HTTPS 和 WebSocket 協議。
  • 高效能:專為高效能通訊設計,透過減少不必要的記憶體分配和 CPU 佔用,以及最佳化網路 I/O 操作來提高效能。
  • 詳細文件和示例:提供詳細的文件和豐富的示例程式碼,幫助大家快速上手。

專案元件

  • TcpServer/TcpClient:用於處理 TCP 連線。
  • SslServer/SslClient:提供 SSL/TLS 加密的 TCP 連線。
  • UdpServer/UdpClient:支援 UDP 資料包傳輸。
  • WsServer/WsClient:支援 WebSocket 通訊。
  • WssServer/WssClient:支援安全的 WebSocket(WebSocket Secure)通訊。
  • UdsServer/UdsClient:支援 Unix Domain Socket 通訊(僅限 Unix/Linux 系統)。
  • HttpServer/HttpClient:提供 HTTP 和 HTTPS 伺服器的實現,支援靜態內容服務和自定義請求處理。

專案環境

  • 作業系統:Linux、macOS、Windows
  • 開發環境:.NET 6.0、7-Zip、CMake、Git、Visual Studio

專案示例

  • TCP 聊天伺服器、聊天客戶端
  • SSL 聊天伺服器、聊天客戶端
  • UDP 回顯伺服器、回顯客戶端
  • UDP 組播伺服器、組播客戶端
  • Unix Domain Socket 聊天伺服器、聊天客戶端
  • 簡單協議
  • 簡單協議伺服器、簡單協議客戶端
  • HTTP/HTTPS伺服器、客戶端
  • WebSocket 聊天伺服器、聊天客戶端
  • WebSocket 安全聊天伺服器、安全聊天客戶端

效能測試

1、往返測試

  • TCP/SSL/UDP 回顯伺服器
  • Unix Domain Socket 回顯伺服器
  • 簡單協議伺服器
  • WebSocket 回顯伺服器/安全回顯伺服器

2、組播測試

  • TCP/SSL/UDP 組播伺服器
  • Unix Domain Socket 組播伺服器
  • WebSocket 組播伺服器/安全組播伺服器

3、Web 伺服器測試

  • HTTP/HTTPS 跟蹤伺服器

專案使用

1、TCP 聊天伺服器

它處理多個 TCP 客戶端會話,並將從任何會話接收到的訊息廣播到所有會話。另外,還可以直接從伺服器傳送管理員訊息。

namespace TcpChatServer
{
    class ChatSession : TcpSession
    {
        public ChatSession(TcpServer server) : base(server) {}

        protected override void OnConnected()
        {
            Console.WriteLine($"Chat TCP session with Id {Id} connected!");

            // 傳送歡迎訊息
            string message = "Hello from TCP chat! Please send a message or '!' to disconnect the client!";
            SendAsync(message);
        }

        protected override void OnDisconnected()
        {
            Console.WriteLine($"Chat TCP session with Id {Id} disconnected!");
        }

        protected override void OnReceived(byte[] buffer, long offset, long size)
        {
            string message = Encoding.UTF8.GetString(buffer, (int)offset, (int)size);
            Console.WriteLine("Incoming: " + message);

            // 向所有已連線的會話廣播訊息
            Server.Multicast(message);

            // 如果接收到的訊息為 '!',則斷開當前會話
            if (message == "!")
                Disconnect();
        }

        protected override void OnError(SocketError error)
        {
            Console.WriteLine($"Chat TCP session caught an error with code {error}");
        }
    }

    class ChatServer : TcpServer
    {
        public ChatServer(IPAddress address, int port) : base(address, port) {}

        protected override TcpSession CreateSession() { return new ChatSession(this); }

        protected override void OnError(SocketError error)
        {
            Console.WriteLine($"Chat TCP server caught an error with code {error}");
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            // TCP 伺服器埠
            int port = 1111;
            if (args.Length > 0)
                port = int.Parse(args[0]);

            Console.WriteLine($"TCP 伺服器埠: {port}");

            Console.WriteLine();

            // 建立一個新的 TCP 聊天伺服器
            var server = new ChatServer(IPAddress.Any, port);

            // 啟動伺服器
            Console.Write("伺服器啟動中...");
            server.Start();
            Console.WriteLine("完成!");

            Console.WriteLine("按 Enter 停止伺服器或輸入 '!' 重啟伺服器...");

            // 執行文字輸入
            for (;;)
            {
                string line = Console.ReadLine();
                if (string.IsNullOrEmpty(line))
                    break;

                // 重啟伺服器
                if (line == "!")
                {
                    Console.Write("伺服器重啟中...");
                    server.Restart();
                    Console.WriteLine("完成!");
                    continue;
                }

                // 向所有會話廣播管理員訊息
                line = "(admin) " + line;
                server.Multicast(line);
            }

            // 停止伺服器
            Console.Write("伺服器停止中...");
            server.Stop();
            Console.WriteLine("完成!");
        }
    }
}

2、TCP 聊天客戶端

它連線到 TCP 聊天伺服器,允許傳送訊息到伺服器並接收新訊息。

namespace TcpChatClient
{
    class ChatClient : TcpClient
    {
        public ChatClient(string address, int port) : base(address, port) {}

        public void DisconnectAndStop()
        {
            _stop = true;
            DisconnectAsync();
            while (IsConnected)
                Thread.Yield();
        }

        protected override void OnConnected()
        {
            Console.WriteLine($"Chat TCP client connected a new session with Id {Id}");
        }

        protected override void OnDisconnected()
        {
            Console.WriteLine($"Chat TCP client disconnected a session with Id {Id}");

            //等待一段時間...
            Thread.Sleep(1000);

            // 嘗試再次連線
            if (!_stop)
                ConnectAsync();
        }

        protected override void OnReceived(byte[] buffer, long offset, long size)
        {
            Console.WriteLine(Encoding.UTF8.GetString(buffer, (int)offset, (int)size));
        }

        protected override void OnError(SocketError error)
        {
            Console.WriteLine($"Chat TCP client caught an error with code {error}");
        }

        private bool _stop;
    }

    class Program
    {
        static void Main(string[] args)
        {
            // TCP 伺服器地址
            string address = "127.0.0.1";
            if (args.Length > 0)
                address = args[0];

            // TCP 伺服器埠
            int port = 1111;
            if (args.Length > 1)
                port = int.Parse(args[1]);

            Console.WriteLine($"TCP server address: {address}");
            Console.WriteLine($"TCP server port: {port}");

            Console.WriteLine();

            // 建立一個新的 TCP 聊天客戶端
            var client = new ChatClient(address, port);

           // 連線客戶端
            Console.Write("Client connecting...");
            client.ConnectAsync();
            Console.WriteLine("Done!");

            Console.WriteLine("Press Enter to stop the client or '!' to reconnect the client...");

            // 執行文字輸入
            for (;;)
            {
                string line = Console.ReadLine();
                if (string.IsNullOrEmpty(line))
                    break;

                // 斷開客戶端連線
                if (line == "!")
                {
                    Console.Write("Client disconnecting...");
                    client.DisconnectAsync();
                    Console.WriteLine("Done!");
                    continue;
                }

                // 將輸入的文字傳送到聊天伺服器
                client.SendAsync(line);
            }

            // 斷開客戶端連線
            Console.Write("Client disconnecting...");
            client.DisconnectAndStop();
            Console.WriteLine("Done!");
        }
    }
}

以上只展示的部分示例,更多示例大家可以訪問專案地址獲取。

專案地址

GitHub:https://github.com/chronoxor/NetCoreServer

線上文件:https://chronoxor.github.io/NetCoreServer

總結

本文只展示部分功能和內容,如果您對專案感興趣可以訪問系統地址獲取詳細資訊和體驗。

希望本文能在.NET 網路通訊方面為各位提供有益的幫助。期待大家在評論區留言交流,分享您的寶貴經驗和建議。

最後

如果你覺得這篇文章對你有幫助,不妨點個贊支援一下!你的支援是我繼續分享知識的動力。如果有任何疑問或需要進一步的幫助,歡迎隨時留言。

也可以加入微信公眾號[DotNet技術匠] 社群,與其他熱愛技術的同行一起交流心得,共同成長!優秀是一種習慣,歡迎大家留言學習!

相關文章