在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算法的連接清除對象,可以更方便地控制連接資源.
