using System;
namespace Jh.Sockets
{
/// <summary>
/// 线程状态信号定义
/// </summary>
public enum JhThreadStatus
{
Stop, //停止
Running, //正在运行
Exit //已退出
}
/// <summary>
/// 线程状态参数
/// </summary>
class Parm
{
public Parm(object obj):this(JhThreadStatus.Stop,obj)
{
}
public Parm(JhThreadStatus nStatus,object obj)
{
Status = nStatus;
ObjParm = obj;
}
JhThreadStatus status;
object objParm;
/// <summary>
/// 上下文对象
/// </summary>
public object ObjParm
{
get
{
return objParm;
}
set
{
objParm = value;
}
}
/// <summary>
/// 控制状态
/// </summary>
public JhThreadStatus Status
{
get
{
return status;
}
set
{
status = value;
}
}
};
/// <summary>
/// 通讯数据处理接口
/// </summary>
public interface IObserver
{
//
// 数据处理入口
//
void Deal(CommData cd);
//
// 数据处理重载方法.如果不希望后面的处理者继续处理数据,则返回true,否则返回false;
//
bool OnDeal(CommData cd);
//
// 附加的自身初始化操作
//
bool Init();
//
// 提前初始化接口
//
bool BeforeInit();
//
// 初始化后处理接口
//
bool AfterInit();
//
// 删除前处理接口
//
bool BeforeExit();
//
// 下一个观察者
//
IObserver Next
{
get;
set;
}
//
// 上一个观察者
//
IObserver Prev
{
get;
set;
}
//
// 添加观察者到后面,如果已经存在链表中则不做任何操作
//
void Add(IObserver observer);
//
// 插入观察者到下一个观察者的前面
//
void Insert(IObserver observer);
//删除观察者
void Remove(IObserver observer);
//是否存在链表中
bool IsExist(IObserver observer);
}
/// <summary>
/// 通讯数据处理类的基类,只能派生
/// </summary>
public abstract class Observer : IObserver
{
/// <summary>
/// 数据处理入口.
/// </summary>
/// <param name="client">TcpClient类 实例</param>
/// <param name="s">内存数据流</param>
public void Deal(CommData cd)
{
cd.Data.Position = 0;
if (OnDeal(cd) == false) return ;
if (next != null)
{
next.Deal(cd);
}
return ;
}
/// <summary>
/// 数据处理重载方法.
/// </summary>
/// <param name="client">TcpClient类 实例</param>
/// <param name="s">内存数据流</param>
/// <returns>处理结果,如果不希望后面的处理者继续处理数据,则返回false,否则返回true;</returns>
public virtual bool OnDeal(CommData cd)
{
return true;
}
//附加的自身初始化操作
public virtual bool Init()
{
return true;
}
//提前初始化接口
public virtual bool BeforeInit()
{
return true;
}
//初始化后处理接口
public virtual bool AfterInit()
{
return true;
}
//删除前处理接口
public virtual bool BeforeExit()
{
return true;
}
//下一个观察者
IObserver next = null;
public IObserver Next
{
get
{
return next;
}
set
{
next = value;
}
}
//上一个观察者
IObserver prev = null;
public IObserver Prev
{
get
{
return prev;
}