使用Beetle簡單構建高性能Socket tpc應用
beetle是基于c#編寫的高性能Socket tcp組件,它基于SocketAsyncEventArgs的實現并提供了發送隊列和接收隊列的支持,可以根據情況靈活地設置1-N個發送隊列和接收隊列。除了隊列上的支持組件還提供Buffer緩沖池和基于Buffer的DataWriter,DataReader對象,從而達到消息可以靈活地分布在多個Buffer中,實現更好的內存利率.為了使處理更高效組件使用多個SocketAsyncEventArgs對數據進行處理,可以同時進行接收和發送操作.經測試beetle可以在一些比較舊的電腦上(core e4300 1.8g)的電腦可以進行6W個以上的send或receive操作,并包括數據包分析、對象寫入緩沖或從緩沖中讀取;就是說可以處理3W個請求并進行數據流分析反序列化對象的同時重新寫入緩沖發送出去;這些測試表明組件提供非常好的性能支持[詳情]。
在使用上傳統Socket編寫tcp應雖然不是復雜但寫起來也是件麻煩的事情,還要處理分包和粘包上的問題。但beetle都解決了以上問題,所有操作都是基于方法和事件來實現,只需要在便建一個對象簡單的綁定一個事件就能完成工作。組件還提供基于分隔符和頭描述大小的方式數據流分包功能,從而讓開發人員有更多的時候專注于邏輯功能的編寫。
以下介紹如何通過Beetle實現一個簡單的socket tcp通訊程序。
首先看一下如何制訂一個socket的監聽服務:
TcpUtils.Setup(100, 1, 1); mServer = new TcpServer(); mServer.ChannelConnected += OnConnected; mServer.ChannelDisposed += OnDisposed; mServer.Open(9133);
在使用組件之前先調用TcpUtils.Setup方法來初始化組件,以上代碼是預先分配100個連接緩沖,分配1組Buffer緩沖池,一個發送隊列和接收隊列。這里可以根據情況的需要來定義相關的數值。初始化完成后的工作就是創建一個TcpServer對象,并綁定兩個主要的事件連接接入和連接釋放;以上工作處理完成后通過調用Open方法打開即可,在不指定IP的情況是綁定當前系統的所有IP。
以上代碼就完成一個簡單的socket tcp服務的構建,但要對連接制行數據接收還需要編寫幾行簡單的代碼:
static void OnConnected(object sender, ChannelEventArgs e) { Console.WriteLine("{0} connected!", e.Channel.EndPoint); e.Channel.DataReceive += OnReceive; e.Channel.ChannelError += OnError; e.Channel.BeginReceive(); } static void OnReceive(object sender, ChannelReceiveEventArgs e) { Console.WriteLine(e.Channel.Coding.GetString(e.Data.Array, e.Data.Offset, e.Data.Count)); }
在連接接入的事件中我們需要對連接的接收數據事件綁定一下,并調用BeginReceive()方法即可以。以上功能只是把接收的數據簡單的輸出到控制臺。
到這里整個服務端就已經完成了,運行個程序只需要通過telnet 127.0.0.1 9133就能測試其工作情況。
接下來我們同樣用Beetle寫一個簡單的客戶端程序接入這個服務,其實寫起來和服務端一樣的簡單:
mChannel = TcpServer.CreateClient(ip, 9133); mChannel.ChannelError += OnError; mChannel.DataReceive += OnReceive; mChannel.BeginReceive();
只需要通過TcpServer.CreateClient方法即向指定的IP端口創建連接,創建之后綁定相關事件即可.
下面就是構造簡單的循還來獲取用戶的輸入并發送到服務端,當輸入為exite的時候退。
INPUT: Console.Write("Command:"); Console.ForegroundColor = ConsoleColor.Green; command = Console.ReadLine(); if (command.IndexOf("exit") == -1) { StringMessage msg = new StringMessage(); msg.Value = command; mChannel.Send(msg); goto INPUT; } mChannel.Dispose(); Console.Read();
這樣一個簡單的客戶也完成,下面看下運行結果
這事例主要體現運用Beetle簡單的實現了一個Socket tcp的應用通訊程序,在下一章會通過實現一個簡單的聊天室來講述Beetle如何制定對象協議和使用ChannelAdapter進行自定義數據協議分析。
如果你想知道Beetle可以做什么,這里提供一個基于Beetle實現免費的網絡文件管理工具 缺點他暫時只能運行在裝有.net 2.0sp1的系統上,如果有更充足的時間會移植到mono上.
下載該文章的事例代碼:
Beelet.Samples.rar (197.56 kb)
轉自:http://www.cnblogs.com/smark/archive/2012/02/21/2361865.html