在Beetle.Express1.2中加了UDP支持,而整體的設計結構也做了調整.只需要通過簡單的配置就能實現高吐的TCP&UDP應用.由於組件引用UDP服務同樣也支持會話狀態所以對於服務是TCP或UDP對使用者來說完全是透明的.使用者只需要關心以下幾個接口即可:IServer(服務描述接口),IChannel(通道會話),IData(發送數據描述),IReceiveData(數據接收描述)和IServerHandler(服務處理接口).而使用在使用組件的時候只需要實現IServerHandler.
IServerHandler
該接口主要用於描述相關服務的工作,包括連接接入,連接釋放,數據接收,數據發送完成和處理錯誤等過程.
/// <summary> /// 服務處理描述接口 /// </summary> public interface IServerHandler { /// <summary> /// 連接創建處理過程 /// </summary> /// <param name="server">對應的Tcp&UDP服務對象</param>
/// <param name="e">連接詳細信息</param> void Connect(IServer server, ChannelConnectEventArgs e); /// <summary> /// 連接斷開處理過程 /// </summary> /// <param name="server">對應的Tcp&UDP服務對象</param>
/// <param name="e">連接詳細信息</param> void Disposed(IServer server, ChannelEventArgs e); /// <summary> /// 錯誤處理過程 /// </summary> /// <param name="server">對應的Tcp&UDP服務對象</param> /// <param name="e">詳細錯誤信息</param> void Error(IServer server, ErrorEventArgs e); /// <summary> /// 數據接收處理過程 /// </summary> /// <param name="server">對應的Tcp&UDP服務對象</param> /// <param name="e">接收數據詳細信息</param> void Receive(IServer server, ChannelReceiveEventArgs e); /// <summary> /// 數據發送情況處理過程 /// </summary> /// <param name="server">對應的Tcp&UDP服務對象</param>
/// <param name="e">數據發送狀態信息</param> void SendCompleted(IServer server, ChannelSendEventArgs e); }
使用Beetle.Express構建TCP或UDP服務,只實現以上接口即可.完全不需要其他工作.
class Program:IServerHandler { public void Connect(IServer server, ChannelConnectEventArgs e) { Console.WriteLine("{0} connected @{1}", e.Channel.EndPoint,server.Name); } public void Disposed(IServer server, ChannelEventArgs e) { Console.WriteLine("{0} disposed", e.Channel.EndPoint); } public void Error(IServer server, ErrorEventArgs e) { Console.WriteLine("{0} error:{1}", e.Channel.EndPoint, e.Error.Message); } public void Receive(IServer server, ChannelReceiveEventArgs e) { string command = e.Data.ToString(Encoding.UTF8); Console.WriteLine("receive:{0}\t@{1}",command,server.Name); Data data = new Data(64); data.Write(server.Name, Encoding.UTF8); server.Send(data, e.Channel); } public void SendCompleted(IServer server, ChannelSendEventArgs e) { } }
以上是實現一個網絡處理服務,對以上代碼來說可以是一個TCP服務也可以是一個UDP服務.由於IServerHandler統一管理服務處理,因此這個實現是TCP或UDP服務取決於ServerFactory加載的配置信息.實際上可以N個TCP服務和UDP服務同時綁定到該Handler上.
綁定服務
組件是通過配置來描服務,可以同時描述多個TCP和UDP服務,下以配置在同一IServerHandler上同量啟動TCP和UDP服務.
<?xml version="1.0"?> <configuration> <configSections> <section name="serverSection" type="Beetle.Express.ServerSection, Beetle.Express"/> </configSections> <serverSection xmlns="urn:Beetle.Express"> <listens> <add name="TEST_TCP" type="TCP" port="8088" handler="Beetle.Express.Sample.Program,Beetle.Express.Sample"/> <add name="TEST_UDP" type="UDP" port="8089" handler="Beetle.Express.Sample.Program,Beetle.Express.Sample"/> </listens> </serverSection> <startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/></startup></configuration>
以上配置是在同一個handler上分別在8088端口上打開TCP服務和在8089打開UDP服務.配置完成后只需要ServerFactory加載即可.
static ServerFactory mFactory; static void Main(string[] args) { mFactory = new ServerFactory("serverSection"); foreach (IServer item in mFactory.Servers) { Console.WriteLine("{0} start @{1}", item.Name, item.Port); } System.Threading.Thread.Sleep(-1); }
通過Beetle.Express可以非常方便就能構建TCP和UDP服務,而在購建的過程是完全不需要關心Socket相關細節,對於連接的處理和數據收發的細節對使用者來說都是完全透明的.組件還提供了基於LRU算法的連接清除對象,可以更方便地控制連接資源.