前言
.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技術匠] 社群,與其他熱愛技術的同行一起交流心得,共同成長!優秀是一種習慣,歡迎大家留言學習!