基于Socket的.NET应用组件
HFSoft.Net组件主要用于简化基于TCP/IP下Socket的程序编写;它在.Net的Socket基础进行应用层面的封装,使开发人员编写基于Socket的网络程序更方便.
组件主要包括以下几个对象: NetListener, IChannel, IMessage和MessageChannel.
NetListener
服务监听对象,用于连接请求、数据接收和发送处理。对象提供连接请求、连接断开、数据接收事件和连接管理等。
IChannel
数据处理通道,主要用于数据的发送和接收;服务端通道和请求端通道统一由IChannel描述。请求端通道通过NetListener的CreateChannel方法创建,服务端通道由NetListener内部创建。
IChannel具体描述:
/// <summary>
/// 数据处理通道
/// </summary>
public interface IChannel
{
/// <summary>
/// 通道关闭事件
/// </summary>
event EventChannelClose Closed;
/// <summary>
/// 运行错误事件
/// </summary>
event EventRunError RunError;
/// <summary>
/// 通道ID,在服务端用于标识唯一性
/// </summary>
string ID
{
get;
set;
}
/// <summary>
///通道名称
/// </summary>
string Name
{
get;
set;
}
/// <summary>
/// 发送数据,当数据过大时通道会自动对数据进行分割和接收
/// </summary>
void Send(Byte[] bytes);
/// <summary>
/// 关闭当前连接
/// </summary>
void Close();
/// <summary>
/// 数据发送和接收大小
/// </summary>
int ReceiveSize
{
get;
set;
}
/// <summary>
/// 当前通道的Socket对象
/// </summary>
System.Net.Sockets.Socket Socket
{
get;
}
/// <summary>
/// 数据接收事件
/// </summary>
event EventChannelReceive Receive;
/// <summary>
/// 获取最近一次处理的错误信息
/// </summary>
Exception Error
{
get;
}
/// <summary>
/// 获了最近一次接收的数据
/// </summary>
byte[] Data
{
get;
}
/// <summary>
/// 获取或设置当前通道是否安全
/// </summary>
bool Sureness
{
get;
set;
}
}
IMessageChannel
消息处理通道,是基于IChannel的扩展。它主要提供对象的发送和接收。IMessageChannel处理的对象必须实现IMessage接口,并不需要可序列化标记。当发送对象数据超过了通道处理范围时,通道会自动对数据分割发送和接收。
IMessageChannel具体描述:
/// <summary>
/// 消息处理通道描述
/// </summary>
public interface IMessageChannel:IDisposable
{
/// <summary>
/// 运行错误事件
/// </summary>
event EventRunError RunError;
/// <summary>
/// 基础数据通道
/// </summary>
IChannel BaseChannel
{
get;
}
/// <summary>
/// 消息接收事件
/// </summary>
event EventMessageReceive Receive;
/// <summary>
/// 关闭消息通道
/// </summary>
void Close();
/// <summary>
/// 消息发送
/// </summary>
/// <param name="message">IMessage</param>
void Send(IMessage message);
/// <summary>
/// 获取最后一次接收的消息对象
/// </summary>
IMessage Message
{
get;
}
/// <summary>
/// 获取最后一次处理的错误信息
/// </summary>
System.Exception Error
{
get;
}
}
IMessage
消息描述接口,用于描述对象的保存和加载过程。当需要发送和接收对象时,对象必须实现IMessage接口,用于实现对象数据的保存和加载。
/// <summary>
/// 消息对象描述接口
/// </summary>
public interface IMessage
{
/// <summary>
/// 对象信息保存方法
/// </summary>
/// <returns>byte[]</returns>
Byte[] Save();
/// <summary>
/// 对象加载信息方法
/// </summary>
/// <param name="bytes">byte[]</param>
void Load(byte[] bytes);
}
为了使用方便,组件提供MessageAdapter对象用于简化消息对象信息的保存和加载。当从MessageAdapter派生类只需要重写protected override object OnSave()和protected override void OnLoad(object obj)方法。
一个简单的登陆验证消息对象:
/// <summary>
/// 登陆验证对象
/// </summary>
public class Login:HFSoft.Net.Message.MessageAdapter
{
public Login()
{
}
private string mClientName;
/// <summary>
/// 登陆的名称
/// </summary>
public string ClientName
{
get
{
return mClientName;
}
set
{
mClientName= value;
}
}
private string mClientPWD;
/// <summary>
/// 登陆密码
/// </summary>
public string ClientPWD
{
get
{
return mClientPWD;
}
set
{
mClientPWD= value;
}
}
protected override object OnSave()
{
object[] objs = new object[]{base.OnSave (),ClientName,ClientPWD};
return objs;
}
protected override void OnLoad(object obj)
{
Object[] objs =(object[])obj;
base.OnLoad (objs[0]);
ClientName =(string)objs[1];
ClientPWD =(string)objs[2];
}
}
创建服务和连接
创建服务:
IPAddress ip = IPAddress.Parse("192.168.1.229);
IPEndPoint point = new IPEndPoint(ip,8080);
Config.Listener = new NetListener(point);
Config.Listener.Start();
//请求连接跟踪
Config.Listener.Accepted += new EventClientPoolChange(ClientConn);
//释放连接跟踪
Config.Listener.Released += new EventClientPoolChange(ClientDis);
//数据接收跟踪
Config.Listener.Receive += new EventChannelReceive(DataReader);
//运行错误跟踪
Config.Listener.RunError += new EventRunError(OnError);
创建连接:
IPAddress ip = IPAddress.Parse("192.168.0.229);
IPEndPoint point = new IPEndPoint(ip,8080);
HFSoft.Net.IChannel ch = HFSoft.Net.NetListener.CreateChannel( point);
对象处理
传统的Socket应用程序是对字节进行发送和接收。因为字节没有任何逻辑表达性,所以开发人员需要制定逻辑数据和字节的一个转换过程这是一件很烦琐的事件。HFSoft.Net就是在传统的Socket处理上进对象处理的封装,开发人员可以通过IMessageChannel进行对象的发送和接收操作。
对象只要实现的IMessage接口或承继MessageAdapter就可以接受IMessageChannel的处理。当你制定的消息对象过于庞大时,IMessageChannel会自动对消息进行切割并进行发送和接收处理。
创建消息处理通道:
IPAddress ip = IPAddress.Parse(txtIPAddress.Text);
IPEndPoint point = new IPEndPoint(ip,(int)txtIPPort.Value);
IChannel ch = HFSoft.Net.NetListener.CreateChannel(point);
IMessageChannel mc = new HFSoft.Net.Message.MessageChannel(ch);
向服务端发送验证请求对象:
Message.Library.Login login = new Message.Library.Login();
login.ClientName = txtUserName.Text;
mc.Send(login);